diff --git a/build.gradle b/build.gradle index 25baba8..e8d416e 100644 --- a/build.gradle +++ b/build.gradle @@ -16,6 +16,17 @@ repositories { // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. // See https://docs.gradle.org/current/userguide/declaring_repositories.html // for more information about repositories. + exclusiveContent { + forRepository { + maven { + name = "Modrinth" + url = "https://api.modrinth.com/maven" + } + } + filter { + includeGroup "maven.modrinth" + } + } } dependencies { @@ -26,6 +37,7 @@ dependencies { // Fabric API. This is technically optional, but you probably want it anyway. modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" + modImplementation "maven.modrinth:modmenu:14.0.0-rc.2" } processResources { diff --git a/src/main/java/de/shiewk/bedrockdeathscreen/BedrockDeathScreenMod.java b/src/main/java/de/shiewk/bedrockdeathscreen/BedrockDeathScreenMod.java index 12e4208..ba812e6 100644 --- a/src/main/java/de/shiewk/bedrockdeathscreen/BedrockDeathScreenMod.java +++ b/src/main/java/de/shiewk/bedrockdeathscreen/BedrockDeathScreenMod.java @@ -2,7 +2,7 @@ package de.shiewk.bedrockdeathscreen; import net.fabricmc.api.ModInitializer; -public class BedrockDeathScreenMod implements ModInitializer { +public final class BedrockDeathScreenMod implements ModInitializer { @Override public void onInitialize() { diff --git a/src/main/java/de/shiewk/bedrockdeathscreen/client/BedrockDeathScreenClient.java b/src/main/java/de/shiewk/bedrockdeathscreen/client/BedrockDeathScreenClient.java index ca95fdf..67b8aa2 100644 --- a/src/main/java/de/shiewk/bedrockdeathscreen/client/BedrockDeathScreenClient.java +++ b/src/main/java/de/shiewk/bedrockdeathscreen/client/BedrockDeathScreenClient.java @@ -1,10 +1,67 @@ package de.shiewk.bedrockdeathscreen.client; +import com.google.gson.Gson; +import de.shiewk.bedrockdeathscreen.config.BedrockDeathScreenConfig; import net.fabricmc.api.ClientModInitializer; +import net.minecraft.client.MinecraftClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; + +public final class BedrockDeathScreenClient implements ClientModInitializer { + + private static final Logger log = LoggerFactory.getLogger(BedrockDeathScreenClient.class); + private static final Gson gson = new Gson(); + private static BedrockDeathScreenConfig config = new BedrockDeathScreenConfig(); + private static Path configPath; -public class BedrockDeathScreenClient implements ClientModInitializer { @Override public void onInitializeClient() { + MinecraftClient minecraftClient = MinecraftClient.getInstance(); + configPath = minecraftClient.runDirectory.toPath().resolve("config/bedrockdeathscreen.json"); + + try { + loadConfig(); + } catch (IOException e) { + throw new RuntimeException(e); + } } + + public static void loadConfig() throws IOException { + log.info("Loading config"); + if (Files.isRegularFile(configPath)){ + try (BufferedReader reader = Files.newBufferedReader(configPath)) { + BedrockDeathScreenConfig loadedConfig = gson.fromJson(reader, BedrockDeathScreenConfig.class); + if (loadedConfig != null) { + config = loadedConfig; + } else { + log.info("Config could not be deserialized, not loading."); + } + } + } else { + log.info("Config file is not a regular file, not loading."); + } + } + + public static BedrockDeathScreenConfig getConfig() { + return config; + } + + public static void saveConfig() throws IOException { + log.info("Saving config"); + Files.createDirectories(configPath.getParent()); + if (!Files.isRegularFile(configPath)){ + Files.createFile(configPath); + } + try (BufferedWriter writer = Files.newBufferedWriter(configPath, StandardOpenOption.TRUNCATE_EXISTING)) { + gson.toJson(config, writer); + } + } } diff --git a/src/main/java/de/shiewk/bedrockdeathscreen/client/screen/BedrockDeathScreen.java b/src/main/java/de/shiewk/bedrockdeathscreen/client/screen/BedrockDeathScreen.java index 7c99e62..bddb9a0 100644 --- a/src/main/java/de/shiewk/bedrockdeathscreen/client/screen/BedrockDeathScreen.java +++ b/src/main/java/de/shiewk/bedrockdeathscreen/client/screen/BedrockDeathScreen.java @@ -1,6 +1,8 @@ package de.shiewk.bedrockdeathscreen.client.screen; +import de.shiewk.bedrockdeathscreen.client.BedrockDeathScreenClient; import de.shiewk.bedrockdeathscreen.client.screen.components.BedrockDeathScreenButton; +import de.shiewk.bedrockdeathscreen.config.BedrockDeathScreenConfig; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.DeathScreen; import net.minecraft.client.gui.screen.MessageScreen; @@ -21,6 +23,7 @@ public class BedrockDeathScreen extends DeathScreen { public static final long CURSOR_HAND = GLFW.glfwCreateStandardCursor(GLFW.GLFW_POINTING_HAND_CURSOR); public static final Identifier VIGNETTE = Identifier.of("bedrockdeathscreen", "textures/gui/death_vignette.png"); + private final BedrockDeathScreenConfig config; private final long screenCreationTime; private final Text message; private Text scoreText = Text.empty(); @@ -36,6 +39,7 @@ public class BedrockDeathScreen extends DeathScreen { public BedrockDeathScreen(@Nullable Text message, boolean isHardcore) { super(message, isHardcore); + this.config = BedrockDeathScreenClient.getConfig(); this.message = message; this.hardcore = isHardcore; screenCreationTime = Util.getMeasuringTimeNano(); @@ -78,9 +82,11 @@ public class BedrockDeathScreen extends DeathScreen { context.drawCenteredTextWithShadow(this.textRenderer, this.message, this.width / 2, (int) (this.height / 3.5), new Color(255, 255, 255, textOpacity).getRGB()); } } - final int scoreTextOpacity = (int) Math.min(255, (totalScreenTime - 1250f) / 3f); - if (scoreTextOpacity > 3){ - context.drawCenteredTextWithShadow(this.textRenderer, this.scoreText, this.width / 2, (int) (this.height / 3.5) + 12, new Color(255, 255, 255, scoreTextOpacity).getRGB()); + if (config.showScore){ + final int scoreTextOpacity = (int) Math.min(255, (totalScreenTime - 1250f) / 3f); + if (scoreTextOpacity > 3){ + context.drawCenteredTextWithShadow(this.textRenderer, this.scoreText, this.width / 2, (int) (this.height / 3.5) + 12, new Color(255, 255, 255, scoreTextOpacity).getRGB()); + } } } diff --git a/src/main/java/de/shiewk/bedrockdeathscreen/client/screen/ConfigScreen.java b/src/main/java/de/shiewk/bedrockdeathscreen/client/screen/ConfigScreen.java new file mode 100644 index 0000000..4c5b206 --- /dev/null +++ b/src/main/java/de/shiewk/bedrockdeathscreen/client/screen/ConfigScreen.java @@ -0,0 +1,82 @@ +package de.shiewk.bedrockdeathscreen.client.screen; + +import de.shiewk.bedrockdeathscreen.client.BedrockDeathScreenClient; +import de.shiewk.bedrockdeathscreen.config.BedrockDeathScreenConfig; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.gui.widget.GridWidget; +import net.minecraft.client.gui.widget.SimplePositioningWidget; +import net.minecraft.client.gui.widget.TextWidget; +import net.minecraft.text.Text; + +import java.io.IOException; + +public final class ConfigScreen extends Screen { + + private final Screen parent; + private final BedrockDeathScreenConfig config = BedrockDeathScreenClient.getConfig(); + private boolean configChanged = false; + + public ConfigScreen(Screen parent) { + super(Text.empty()); + this.parent = parent; + } + + @Override + protected void init() { + addDrawableChild(new TextWidget( + 0, 5, width, 9, + Text.translatable("bedrockdeathscreen.config"), + textRenderer + )); + addDrawableChild(new ButtonWidget.Builder( + Text.translatable("gui.done"), + button -> this.close() + ).position(width / 2 - 75, this.height - 25).build()); + + GridWidget grid = new GridWidget(); + grid.getMainPositioner().margin(4, 4, 4, 4); + final GridWidget.Adder adder = grid.createAdder(2); + + adder.add(createButton( + "bedrockdeathscreen.config.showScore", + config.showScore, + button -> { + config.showScore = !config.showScore; + configChanged = true; + button.setMessage(getButtonText("bedrockdeathscreen.config.showScore", config.showScore)); + } + )); + + grid.refreshPositions(); + SimplePositioningWidget.setPos(grid, 0, 0, this.width, this.height, 0.5F, 0.5F); + grid.forEachChild(this::addDrawableChild); + } + + private Text getButtonText(String translation, boolean state) { + return Text.translatable( + translation, + state ? Text.translatable("gui.yes") : Text.translatable("gui.no") + ).withColor(state ? 0x00ff00 : 0xff5555); + } + + private ButtonWidget createButton(String translation, boolean state, ButtonWidget.PressAction action) { + return ButtonWidget.builder( + getButtonText(translation, state), + action + ).build(); + } + + @Override + public void close() { + if (configChanged){ + try { + BedrockDeathScreenClient.saveConfig(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + assert client != null; + client.setScreen(parent); + } +} diff --git a/src/main/java/de/shiewk/bedrockdeathscreen/config/BedrockDeathScreenConfig.java b/src/main/java/de/shiewk/bedrockdeathscreen/config/BedrockDeathScreenConfig.java new file mode 100644 index 0000000..6595ca2 --- /dev/null +++ b/src/main/java/de/shiewk/bedrockdeathscreen/config/BedrockDeathScreenConfig.java @@ -0,0 +1,7 @@ +package de.shiewk.bedrockdeathscreen.config; + +public final class BedrockDeathScreenConfig { + + public boolean showScore = true; + +} diff --git a/src/main/java/de/shiewk/bedrockdeathscreen/config/ModMenuConfig.java b/src/main/java/de/shiewk/bedrockdeathscreen/config/ModMenuConfig.java new file mode 100644 index 0000000..e512ebc --- /dev/null +++ b/src/main/java/de/shiewk/bedrockdeathscreen/config/ModMenuConfig.java @@ -0,0 +1,14 @@ +package de.shiewk.bedrockdeathscreen.config; + +import com.terraformersmc.modmenu.api.ConfigScreenFactory; +import com.terraformersmc.modmenu.api.ModMenuApi; +import de.shiewk.bedrockdeathscreen.client.screen.ConfigScreen; + +public final class ModMenuConfig implements ModMenuApi { + + @Override + public ConfigScreenFactory getModConfigScreenFactory() { + return ConfigScreen::new; + } + +} diff --git a/src/main/resources/assets/bedrockdeathscreen/lang/de_de.json b/src/main/resources/assets/bedrockdeathscreen/lang/de_de.json new file mode 100644 index 0000000..63b2555 --- /dev/null +++ b/src/main/resources/assets/bedrockdeathscreen/lang/de_de.json @@ -0,0 +1,4 @@ +{ + "bedrockdeathscreen.config": "BedrockDeathScreen-Einstellungen", + "bedrockdeathscreen.config.showScore": "Punktestand anzeigen: %s" +} \ No newline at end of file diff --git a/src/main/resources/assets/bedrockdeathscreen/lang/en_us.json b/src/main/resources/assets/bedrockdeathscreen/lang/en_us.json new file mode 100644 index 0000000..a399f97 --- /dev/null +++ b/src/main/resources/assets/bedrockdeathscreen/lang/en_us.json @@ -0,0 +1,4 @@ +{ + "bedrockdeathscreen.config": "BedrockDeathScreen config", + "bedrockdeathscreen.config.showScore": "Show score: %s" +} \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 3a15e04..72a974b 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -19,6 +19,9 @@ ], "main": [ "de.shiewk.bedrockdeathscreen.BedrockDeathScreenMod" + ], + "modmenu": [ + "de.shiewk.bedrockdeathscreen.config.ModMenuConfig" ] }, "mixins": [