From 1783c04c87f4f525b39a9893eef234e3c954f2dc Mon Sep 17 00:00:00 2001 From: Oth3r <68134921+Oth3r@users.noreply.github.com> Date: Sun, 4 May 2025 17:43:37 -0500 Subject: [PATCH] switch to otterlib config UI --- src/main/java/one/oth3r/sit/SitClient.java | 26 ++++- .../java/one/oth3r/sit/file/CustomFile.java | 101 ------------------ .../sit/screen/ClickableImageWidget.java | 27 ----- .../one/oth3r/sit/screen/ConfigScreen.java | 77 ------------- .../java/one/oth3r/sit/screen/ModMenu.java | 3 +- .../oth3r/sit/screen/TextureButtonWidget.java | 86 --------------- .../sit/screen/UnderConstructionScreen.java | 79 -------------- src/main/java/one/oth3r/sit/utl/Events.java | 5 +- 8 files changed, 29 insertions(+), 375 deletions(-) delete mode 100644 src/main/java/one/oth3r/sit/file/CustomFile.java delete mode 100644 src/main/java/one/oth3r/sit/screen/ClickableImageWidget.java delete mode 100644 src/main/java/one/oth3r/sit/screen/ConfigScreen.java delete mode 100644 src/main/java/one/oth3r/sit/screen/TextureButtonWidget.java delete mode 100644 src/main/java/one/oth3r/sit/screen/UnderConstructionScreen.java diff --git a/src/main/java/one/oth3r/sit/SitClient.java b/src/main/java/one/oth3r/sit/SitClient.java index 43833dc..09799cd 100644 --- a/src/main/java/one/oth3r/sit/SitClient.java +++ b/src/main/java/one/oth3r/sit/SitClient.java @@ -1,8 +1,19 @@ package one.oth3r.sit; import net.fabricmc.api.ClientModInitializer; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; +import one.oth3r.otterlib.client.screen.ConfigScreen; +import one.oth3r.otterlib.client.screen.utl.CustomImage; +import one.oth3r.otterlib.client.screen.utl.SimpleButton; +import one.oth3r.sit.file.FileData; import one.oth3r.sit.utl.Data; import one.oth3r.sit.utl.Events; +import one.oth3r.sit.utl.Utl; + +import java.net.URI; +import java.util.List; public class SitClient implements ClientModInitializer { @@ -12,5 +23,18 @@ public class SitClient implements ClientModInitializer { Events.registerClient(); } - + public static Screen getConfigScreen(Screen parent) { + return new ConfigScreen(parent, Text.translatable("sit!.screen.config"), + new CustomImage(Identifier.of(Data.MOD_ID, "textures/gui/banner.png"),128, 72), + List.of( + SimpleButton.Templates.fileEditor(Utl.lang("config.server"), FileData.getServerConfig(), new CustomImage(Identifier.of(Data.MOD_ID, "server_button"),246,26)).build(), + SimpleButton.Templates.fileEditor(Utl.lang("config.sitting"), FileData.getSittingConfig(), new CustomImage(Identifier.of(Data.MOD_ID, "sitting_button"), 246, 26)).build() + ), + List.of( + SimpleButton.Templates.warning(Utl.lang("sit!.gui.button.issues")).openLink("https://github.com/Oth3r/Sit/issues").build(), + new SimpleButton.Builder(Utl.lang("sit!.gui.button.website")).openLink("https://modrinth.com/mod/sit!").build(), + SimpleButton.Templates.done(Utl.lang("gui.done")).build(), + SimpleButton.Templates.donate(Utl.lang("sit!.gui.button.donate")).openLink(URI.create("https://ko-fi.com/oth3r")).build() + )); + } } diff --git a/src/main/java/one/oth3r/sit/file/CustomFile.java b/src/main/java/one/oth3r/sit/file/CustomFile.java deleted file mode 100644 index eab2d74..0000000 --- a/src/main/java/one/oth3r/sit/file/CustomFile.java +++ /dev/null @@ -1,101 +0,0 @@ -package one.oth3r.sit.file; - -import net.fabricmc.loader.api.FabricLoader; -import one.oth3r.sit.utl.Data; -import one.oth3r.sit.utl.Utl; -import org.jetbrains.annotations.NotNull; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Paths; - -public interface CustomFile > { - - void reset(); - - /** - * saves the current instance to file - */ - default void save() { - if (!getFile().exists()) { - Data.LOGGER.info(String.format("Creating new `%s`", getFile().getName())); - } - try (BufferedWriter writer = Files.newBufferedWriter(getFile().toPath(), StandardCharsets.UTF_8)) { - writer.write(Utl.getGson().toJson(this)); - } catch (Exception e) { - Data.LOGGER.error(String.format("ERROR SAVING '%s`: %s", getFile().getName(), e.getMessage())); - } - } - - /** - * loads the file to the current instance using updateFromReader() - */ - default void load() { - File file = getFile(); - if (!file.exists()) fileNotExist(); - // try reading the file - try (BufferedReader reader = Files.newBufferedReader(file.toPath(), StandardCharsets.UTF_8)) { - updateFromReader(reader); - } catch (Exception e) { - Data.LOGGER.error(String.format("ERROR LOADING '%s`: %s", file.getName(),e.getMessage())); - } - } - - default void updateFromReader(BufferedReader reader) { - // try to read the json - T file; - try { - file = Utl.getGson().fromJson(reader, getFileClass()); - } catch (Exception e) { - throw new NullPointerException(); - } - // throw null if the fileData is null or version is null - if (file == null) throw new NullPointerException(); - - // update the instance - file.update(); - // load the file to the current object - loadFileData(file); - } - - @NotNull - Class getFileClass(); - - /** - * loads the data from the file object into the current object - * @param newFile the file to take the properties from - */ - void loadFileData(T newFile); - - /** - * updates the file based on the version number of the current instance - */ - void update(); - - /** - * logic for the file not existing when loading, defaults to saving - */ - default void fileNotExist() { - // try to make the config directory - try { - Files.createDirectories(Paths.get(getDirectory())); - } catch (Exception e) { - Data.LOGGER.error("Failed to create config directory. Canceling all config loading..."); - return; - } - save(); - } - - String getFileName(); - - default String getDirectory() { - return FabricLoader.getInstance().getConfigDir().toFile()+"/"; - } - - default File getFile() { - return new File(getDirectory()+getFileName()); - } -} diff --git a/src/main/java/one/oth3r/sit/screen/ClickableImageWidget.java b/src/main/java/one/oth3r/sit/screen/ClickableImageWidget.java deleted file mode 100644 index c663036..0000000 --- a/src/main/java/one/oth3r/sit/screen/ClickableImageWidget.java +++ /dev/null @@ -1,27 +0,0 @@ -package one.oth3r.sit.screen; - -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.tooltip.Tooltip; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; - -import java.util.function.Supplier; - -public class ClickableImageWidget extends ButtonWidget { - private final Identifier image; - - public ClickableImageWidget(int x, int y, int width, int height, Tooltip tooltip, Identifier image, ButtonWidget.PressAction onPress) { - super(x, y, width, height, Text.empty(), onPress, Supplier::get); - this.image = image; - this.setTooltip(tooltip); - } - - @Override - protected void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { - context.drawTexture(RenderLayer::getGuiTextured, image, - this.getX(), this.getY(), 0.0f, 0.0f, this.getWidth(), this.getHeight(), this.getWidth(), this.getHeight()); - } - -} diff --git a/src/main/java/one/oth3r/sit/screen/ConfigScreen.java b/src/main/java/one/oth3r/sit/screen/ConfigScreen.java deleted file mode 100644 index c95b492..0000000 --- a/src/main/java/one/oth3r/sit/screen/ConfigScreen.java +++ /dev/null @@ -1,77 +0,0 @@ -package one.oth3r.sit.screen; - -import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.ConfirmLinkScreen; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.ColorHelper; -import one.oth3r.sit.file.FileData; -import one.oth3r.sit.utl.Data; - -import java.net.URI; - -public class ConfigScreen extends Screen { - protected final Screen parent; - - public ConfigScreen(Screen parent) { - super(Text.translatable("sit!.screen.config")); - this.parent = parent; - } - - @Override - protected void init() { - int startY = this.height / 4 + 48; - int spacing = 36; - TextureButtonWidget serverConfigButton = this.addDrawableChild(new TextureButtonWidget.Builder(Text.translatable("config.server"), - (button) -> client.setScreen(new UnderConstructionScreen(this, FileData.getServerConfig())), false) - .dimensions(250,30).texture(Identifier.of(Data.MOD_ID, "server_button"), 246, 26).build()); - serverConfigButton.setPosition(this.width / 2 - (serverConfigButton.getWidth()/2), startY); - - TextureButtonWidget sittingConfigButton = this.addDrawableChild(new TextureButtonWidget.Builder(Text.translatable("config.sitting"), - (button) -> client.setScreen(new UnderConstructionScreen(this, FileData.getSittingConfig())), false) - .dimensions(250,30).texture(Identifier.of(Data.MOD_ID, "sitting_button"), 246, 26).build()); - sittingConfigButton.setPosition(this.width / 2 - (sittingConfigButton.getWidth()/2), startY+36); - - - TextureButtonWidget issuesButton = this.addDrawableChild(new TextureButtonWidget.Builder(Text.translatable("sit!.gui.button.issues"), - ConfirmLinkScreen.opening(this, URI.create("https://github.com/Oth3r/Sit/issues")), true) - .dimensions(20,20).texture(Identifier.of(Data.MOD_ID, "issues"), 15, 15).build()); - issuesButton.setPosition(this.width / 2 - 125, startY + 72 + 12); - - - this.addDrawableChild(ButtonWidget.builder(Text.translatable("sit!.gui.button.website"), - ConfirmLinkScreen.opening(this, URI.create("https://modrinth.com/mod/sit!")) - ).dimensions(this.width / 2 - 100, startY + 72 + 12, 98, 20).build()); - - this.addDrawableChild(ButtonWidget.builder(Text.translatable("gui.done"), (button) -> { - close(); - }).dimensions(this.width / 2 + 2, startY + 72 + 12, 98, 20).build()); - - TextureButtonWidget donateButton = this.addDrawableChild(new TextureButtonWidget.Builder(Text.translatable("sit!.gui.button.donate"), - ConfirmLinkScreen.opening(this, URI.create("https://Ko-fi.com/oth3r")), true) - .dimensions(20,20).texture(Identifier.of(Data.MOD_ID, "donate"), 15, 15).build()); - donateButton.setPosition(this.width / 2 + 105, startY + 72 + 12); - } - - @Override - public void render(DrawContext context, int mouseX, int mouseY, float delta) { - super.render(context, mouseX, mouseY, delta); - - // todo fade in like the title screen on first load? - renderBanner(context,width/2 - 64,this.height / 4 -38,1); - } - - @Override - public void close() { - this.client.setScreen(parent); - } - - private void renderBanner(DrawContext context, int x, int y, float alpha) { - context.drawTexture(RenderLayer::getGuiTextured,Identifier.of(Data.MOD_ID, "textures/gui/banner.png"), - x, y, 0.0f, 0.0f, 128, 72, 128, 72, ColorHelper.getWhite(alpha)); - } -} diff --git a/src/main/java/one/oth3r/sit/screen/ModMenu.java b/src/main/java/one/oth3r/sit/screen/ModMenu.java index 7a64bf2..7af676a 100644 --- a/src/main/java/one/oth3r/sit/screen/ModMenu.java +++ b/src/main/java/one/oth3r/sit/screen/ModMenu.java @@ -2,10 +2,11 @@ package one.oth3r.sit.screen; import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ModMenuApi; +import one.oth3r.sit.SitClient; public class ModMenu implements ModMenuApi { @Override public ConfigScreenFactory getModConfigScreenFactory() { - return ConfigScreen::new; + return SitClient::getConfigScreen; } } diff --git a/src/main/java/one/oth3r/sit/screen/TextureButtonWidget.java b/src/main/java/one/oth3r/sit/screen/TextureButtonWidget.java deleted file mode 100644 index 6a13691..0000000 --- a/src/main/java/one/oth3r/sit/screen/TextureButtonWidget.java +++ /dev/null @@ -1,86 +0,0 @@ -package one.oth3r.sit.screen; - -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.tooltip.Tooltip; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; -import org.jetbrains.annotations.Nullable; - -public class TextureButtonWidget extends ButtonWidget { - //todo gray support - protected final Identifier texture; - protected final int textureWidth; - protected final int textureHeight; - protected final boolean tooltip; - - TextureButtonWidget(int width, int height, Text message, int textureWidth, int textureHeight, Identifier texture, ButtonWidget.PressAction onPress, @Nullable ButtonWidget.NarrationSupplier narrationSupplier, boolean tooltip) { - super(0, 0, width, height, message, onPress, narrationSupplier == null ? DEFAULT_NARRATION_SUPPLIER : narrationSupplier); - this.textureWidth = textureWidth; - this.textureHeight = textureHeight; - this.texture = texture; - this.tooltip = tooltip; - if (tooltip) setTooltip(Tooltip.of(message)); - } - - @Override - public void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { - super.renderWidget(context, mouseX, mouseY, delta); - int x = this.getX() + this.getWidth() / 2 - this.textureWidth / 2; - int y = this.getY() + this.getHeight() / 2 - this.textureHeight / 2; - context.drawGuiTexture(RenderLayer::getGuiTextured, this.texture, x, y, this.textureWidth, this.textureHeight); - } - - @Override - public void drawMessage(DrawContext context, TextRenderer textRenderer, int color) { - if (!this.tooltip) super.drawMessage(context, textRenderer, color); - } - - - public static class Builder { - private final Text text; - private final ButtonWidget.PressAction onPress; - private final boolean hideText; - private int width = 150; - private int height = 20; - @Nullable - private Identifier texture; - private int textureWidth; - private int textureHeight; - @Nullable - ButtonWidget.NarrationSupplier narrationSupplier; - - public Builder(Text text, ButtonWidget.PressAction onPress, boolean hideText) { - this.text = text; - this.onPress = onPress; - this.hideText = hideText; - } - - public Builder dimensions(int width, int height) { - this.width = width; - this.height = height; - return this; - } - - public Builder texture(Identifier texture, int width, int height) { - this.texture = texture; - this.textureWidth = width; - this.textureHeight = height; - return this; - } - - public Builder narration(ButtonWidget.NarrationSupplier narrationSupplier) { - this.narrationSupplier = narrationSupplier; - return this; - } - - public TextureButtonWidget build() { - if (this.texture == null) { - throw new IllegalStateException("Sprite not set"); - } - return new TextureButtonWidget(width,height,text,textureWidth,textureHeight,texture,onPress,narrationSupplier,hideText); - } - } -} diff --git a/src/main/java/one/oth3r/sit/screen/UnderConstructionScreen.java b/src/main/java/one/oth3r/sit/screen/UnderConstructionScreen.java deleted file mode 100644 index 8395f35..0000000 --- a/src/main/java/one/oth3r/sit/screen/UnderConstructionScreen.java +++ /dev/null @@ -1,79 +0,0 @@ -package one.oth3r.sit.screen; - -import net.minecraft.client.gui.screen.ConfirmLinkScreen; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.tooltip.Tooltip; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; -import net.minecraft.util.Util; -import one.oth3r.sit.file.CustomFile; -import one.oth3r.sit.file.SittingConfig; -import one.oth3r.sit.utl.Data; -import one.oth3r.sit.utl.Utl; - -import java.net.URI; -import java.nio.file.Paths; - -public class UnderConstructionScreen> extends Screen { - protected final Screen parent; - protected T file; - - public UnderConstructionScreen(Screen parent, T file) { - super(Text.translatable("sit!.screen.config")); - this.parent = parent; - this.file = file; - } - - @Override - protected void init() { - int startY = this.height / 5-4; - ButtonWidget foxPNG = this.addDrawableChild(new ClickableImageWidget(70,70,140,140, Tooltip.of(Text.of("Art by @bunnestbun")), - Identifier.of(Data.MOD_ID, "textures/gui/fox.png"), ConfirmLinkScreen.opening(this, URI.create("https://www.instagram.com/bunnestbun/")))); - foxPNG.setPosition(this.width / 2 - (foxPNG.getWidth()/2), startY-35); - - ButtonWidget openFileButton = this.addDrawableChild(new ButtonWidget.Builder(Text.translatable("sit!.gui.button.file"), - (button) -> Util.getOperatingSystem().open(this.file.getFile())) - .dimensions(0, 0, 118 ,20).build()); - openFileButton.setPosition(this.width / 2 - 70, startY+110); - - TextureButtonWidget folderButton = this.addDrawableChild(new TextureButtonWidget.Builder(Text.translatable("sit!.gui.button.folder"), - (button) -> Util.getOperatingSystem().open(Paths.get(this.file.getFile().getParent())), true) - .dimensions(20,20).texture(Identifier.of(Data.MOD_ID, "folder"), 15, 15).build()); - folderButton.setPosition(this.width / 2 + 50, startY + 110); - - TextureButtonWidget resetButton = this.addDrawableChild(new TextureButtonWidget.Builder(Text.translatable("sit!.gui.button.reset"), - (button) -> { - this.file.reset(); - this.file.save(); - }, true) - .dimensions(20,20).texture(Identifier.of(Data.MOD_ID, "reset_file"), 15, 15).build()); - resetButton.setPosition(this.width / 2 -70, startY + 135); - - ButtonWidget revertButton = this.addDrawableChild(new ButtonWidget.Builder(Text.translatable("sit!.gui.button.revert"), - (button) -> this.file.save()) - .dimensions(0, 0, 118,20).build()); - revertButton.setPosition(this.width / 2 - 48, startY+135); - - - ButtonWidget saveExitButton = this.addDrawableChild(new ButtonWidget.Builder(Text.translatable("sit!.gui.button.save"), - (button) -> { - this.file.load(); - this.file.save(); - - // send the settings to the server if editing the sitting file and on a supported server - if (this.file instanceof SittingConfig && Data.isSupportedServer()) { - Utl.sendSettingsPackets(); - } - - this.client.setScreen(parent); - }) - .dimensions(0, 0, 140,20).build()); - saveExitButton.setPosition(this.width / 2 - 70, startY+168); - } - - @Override - public void close() { - this.client.setScreen(parent); - } -} diff --git a/src/main/java/one/oth3r/sit/utl/Events.java b/src/main/java/one/oth3r/sit/utl/Events.java index e375283..0b5c5e6 100644 --- a/src/main/java/one/oth3r/sit/utl/Events.java +++ b/src/main/java/one/oth3r/sit/utl/Events.java @@ -20,13 +20,12 @@ import net.minecraft.client.option.KeyBinding; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.ActionResult; -import net.minecraft.util.Formatting; +import one.oth3r.sit.SitClient; import one.oth3r.sit.command.SitCommand; import one.oth3r.sit.file.FileData; import one.oth3r.sit.file.LangReader; import one.oth3r.sit.file.SittingConfig; import one.oth3r.sit.packet.SitPayloads; -import one.oth3r.sit.screen.ConfigScreen; import org.lwjgl.glfw.GLFW; import java.awt.*; @@ -60,7 +59,7 @@ public class Events { ClientPlayerEntity player = client.player; while (config__key.wasPressed()) { - client.setScreen(new ConfigScreen(client.currentScreen)); + client.setScreen(SitClient.getConfigScreen(client.currentScreen)); } /// anything below uses the player object, make sure it's not null