From 033d175097bc52eb1d46a6ee9d250d4e8c3bf8b5 Mon Sep 17 00:00:00 2001 From: Wynd Date: Fri, 30 Aug 2024 13:18:57 +0300 Subject: [PATCH] Added a cloud height slider in video options --- .../xyz/pixelatedw/finalbeta/ModConfig.java | 2 + .../xyz/pixelatedw/finalbeta/ModSlider.java | 79 +++++++++++++++++++ .../xyz/pixelatedw/finalbeta/WyHelper.java | 2 +- .../finalbeta/mixin/DimensionMixin.java | 20 +++++ .../finalbeta/mixin/ScreenMixin.java | 10 +++ .../mixin/VideoSettingsScreenMixin.java | 29 +++++-- src/main/resources/finalbeta.mixins.json | 3 +- 7 files changed, 136 insertions(+), 9 deletions(-) create mode 100644 src/main/java/xyz/pixelatedw/finalbeta/ModSlider.java create mode 100644 src/main/java/xyz/pixelatedw/finalbeta/mixin/DimensionMixin.java diff --git a/src/main/java/xyz/pixelatedw/finalbeta/ModConfig.java b/src/main/java/xyz/pixelatedw/finalbeta/ModConfig.java index 5ac1f9e..7f02424 100644 --- a/src/main/java/xyz/pixelatedw/finalbeta/ModConfig.java +++ b/src/main/java/xyz/pixelatedw/finalbeta/ModConfig.java @@ -48,6 +48,8 @@ public class ModConfig { "Enables furance minecarts to push forward the first minecart it comes in contact with"); public static final Option FURNACE_MINECART_CHUNK_LOADING = make("Enable furnace minecarts to load chunks", true, "Name says it all, furnace minecarts will load chunks as they go on tracks."); + public static final Option CLOUDS_HEIGHT = make("Clouds Height", 0.0, + "Clouds height modifier, goes from 0.0, meaning the default 108 blocks height, to 1.0, meaning a 324 blocks height."); public static final Option FIX_BOW_MODEL = make("Fix bow model", true, "Makes the box model held by players and skeletons bigger and facing forward"); diff --git a/src/main/java/xyz/pixelatedw/finalbeta/ModSlider.java b/src/main/java/xyz/pixelatedw/finalbeta/ModSlider.java new file mode 100644 index 0000000..aa711fe --- /dev/null +++ b/src/main/java/xyz/pixelatedw/finalbeta/ModSlider.java @@ -0,0 +1,79 @@ +package xyz.pixelatedw.finalbeta; + +import org.lwjgl.opengl.GL11; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.widgets.Button; + +public class ModSlider extends Button { + public float value = 1.0F; + public boolean dragged = false; + public final String defaultText; + private final IChanceValue changeEvent; + + public ModSlider(int id, int x, int y, String label, float initialValue, IChanceValue changeEvent) { + super(id, x, y, 150, 20, label); + this.value = initialValue; + this.defaultText = label; + this.changeEvent = changeEvent; + this.text = this.defaultText + "" + String.format("%.2f", this.value); + } + + @Override + protected int getYImage(boolean flag) { + return 0; + } + + @Override + protected void postRender(Minecraft minecraft, int i, int j) { + if (this.visible) { + if (this.dragged) { + this.value = (float) (i - (this.x + 4)) / (float) (this.width - 8); + if (this.value < 0.0F) { + this.value = 0.0F; + } + + if (this.value > 1.0F) { + this.value = 1.0F; + } + + this.changeEvent.changeValue(this.value); + this.text = this.defaultText + "" + String.format("%.2f", this.value); + } + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.blit(this.x + (int) (this.value * (this.width - 8)), this.y, 0, 66, 4, 20); + this.blit(this.x + (int) (this.value * (this.width - 8)) + 4, this.y, 196, 66, 4, 20); + } + } + + @Override + public boolean isMouseOver(Minecraft minecraft, int i, int j) { + if (super.isMouseOver(minecraft, i, j)) { + this.value = (float) (i - (this.x + 4)) / (float) (this.width - 8); + if (this.value < 0.0F) { + this.value = 0.0F; + } + + if (this.value > 1.0F) { + this.value = 1.0F; + } + + this.changeEvent.changeValue(this.value); + this.text = this.defaultText + "" + String.format("%.2f", this.value); + this.dragged = true; + return true; + } else { + return false; + } + } + + @Override + public void mouseReleased(int i, int j) { + this.dragged = false; + } + + public interface IChanceValue { + void changeValue(float value); + } +} diff --git a/src/main/java/xyz/pixelatedw/finalbeta/WyHelper.java b/src/main/java/xyz/pixelatedw/finalbeta/WyHelper.java index db3f846..a5f84f5 100644 --- a/src/main/java/xyz/pixelatedw/finalbeta/WyHelper.java +++ b/src/main/java/xyz/pixelatedw/finalbeta/WyHelper.java @@ -95,7 +95,7 @@ public class WyHelper { // Slime slime = new Slime(player.level); // slime.setPositionAndAngles(player.x, player.y + 0.5D, player.z, player.level.rand.nextFloat() * 360.0F, 0.0F); // player.level.spawnEntity(slime); -// slime.setSize(10); +// slime.setSize(5); // player.level.entities.stream().filter(e -> !(e instanceof Player)).forEach((e) -> ((net.minecraft.entity.Entity)e).remove()); diff --git a/src/main/java/xyz/pixelatedw/finalbeta/mixin/DimensionMixin.java b/src/main/java/xyz/pixelatedw/finalbeta/mixin/DimensionMixin.java new file mode 100644 index 0000000..a372c70 --- /dev/null +++ b/src/main/java/xyz/pixelatedw/finalbeta/mixin/DimensionMixin.java @@ -0,0 +1,20 @@ +package xyz.pixelatedw.finalbeta.mixin; + +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.CallbackInfoReturnable; + +import net.minecraft.level.dimension.Dimension; +import xyz.pixelatedw.finalbeta.ModConfig; + +@Mixin(Dimension.class) +public class DimensionMixin { + private static final float CLOUD_HEIGHT = 108.0F; + + @Inject(method = "getCloudHeight", at = @At("RETURN"), cancellable = true) + private void getCloudHeight(CallbackInfoReturnable cir) { + float height = CLOUD_HEIGHT + (CLOUD_HEIGHT * 2.0f * ModConfig.CLOUDS_HEIGHT.get().floatValue()); + cir.setReturnValue(height); + } +} diff --git a/src/main/java/xyz/pixelatedw/finalbeta/mixin/ScreenMixin.java b/src/main/java/xyz/pixelatedw/finalbeta/mixin/ScreenMixin.java index 140c504..0715301 100644 --- a/src/main/java/xyz/pixelatedw/finalbeta/mixin/ScreenMixin.java +++ b/src/main/java/xyz/pixelatedw/finalbeta/mixin/ScreenMixin.java @@ -4,6 +4,9 @@ import java.util.List; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Screen; @@ -16,4 +19,11 @@ public class ScreenMixin { @Shadow public List buttons; + + @Inject(method = "onClose", at = @At("HEAD")) + public void onClose(CallbackInfo ci) { + this.onCloseEvent(); + } + + public void onCloseEvent() {} } diff --git a/src/main/java/xyz/pixelatedw/finalbeta/mixin/VideoSettingsScreenMixin.java b/src/main/java/xyz/pixelatedw/finalbeta/mixin/VideoSettingsScreenMixin.java index 87c80ba..71e2811 100644 --- a/src/main/java/xyz/pixelatedw/finalbeta/mixin/VideoSettingsScreenMixin.java +++ b/src/main/java/xyz/pixelatedw/finalbeta/mixin/VideoSettingsScreenMixin.java @@ -9,27 +9,42 @@ import net.minecraft.client.gui.screen.VideoSettingsScreen; import net.minecraft.client.gui.widgets.Button; import net.minecraft.client.resource.language.TranslationStorage; import xyz.pixelatedw.finalbeta.ModConfig; +import xyz.pixelatedw.finalbeta.ModSlider; @Mixin(VideoSettingsScreen.class) -public class VideoSettingsScreenMixin extends ScreenMixin { - +public class VideoSettingsScreenMixin extends ScreenMixin { + @Inject(method = "init", at = @At("TAIL")) public void init(CallbackInfo ci) { VideoSettingsScreen screen = (VideoSettingsScreen)(Object)this; + this.buttons.add(new Button(300, screen.width / 2 - 155, screen.height / 6 + 96, 150, 20, this.getCloudsLabel())); + this.buttons.add(new ModSlider(301, screen.width / 2 + 5, screen.height / 6 + 96, this.getCloudHeightLabel(), ModConfig.CLOUDS_HEIGHT.get().floatValue(), (val) -> ModConfig.CLOUDS_HEIGHT.set((double) val))); } - - @Inject(method = "buttonClicked", at = @At("HEAD")) + + @Inject(method = "buttonClicked", at = @At("HEAD"), cancellable = true) public void buttonClicked(Button btn, CallbackInfo ci) { - if(btn.active) { - if(btn.id == 300) { + if (btn.active) { + if (btn.id == 300) { ModConfig.ENABLE_CLOUDS.set(!ModConfig.ENABLE_CLOUDS.get()); + ci.cancel(); + } + else if(btn.id == 301) { + ci.cancel(); } } } - + + @Override + public void onCloseEvent() { + } + private String getCloudsLabel() { TranslationStorage i18n = TranslationStorage.getInstance(); return "Clouds: " + (ModConfig.ENABLE_CLOUDS.get() ? i18n.translate("options.on") : i18n.translate("options.off")); } + + private String getCloudHeightLabel() { + return "Clouds Height: "; + } } diff --git a/src/main/resources/finalbeta.mixins.json b/src/main/resources/finalbeta.mixins.json index f4bf8ae..a95640f 100644 --- a/src/main/resources/finalbeta.mixins.json +++ b/src/main/resources/finalbeta.mixins.json @@ -42,7 +42,8 @@ "RecipeRegistryMixin", "SnowballMixin", "EntityMixin", - "SlimeMixin" + "SlimeMixin", + "DimensionMixin" ], "injectors": { "defaultRequire": -1