From 8c344ec47deac1914cd32d6258bdedf169b33124 Mon Sep 17 00:00:00 2001 From: Lucas Petrino Date: Mon, 21 Oct 2024 19:05:51 +1300 Subject: [PATCH] fix: client allowing trident use while server weather not thundering This change fixes some issues where when using weather changer and setting your client weather to thunder trident usage would be allowed even when the server weather was not thundering, also fixes an issue where on single player mobs would spawn when client weather was set to rain or thunder This commit also releases version 1.2.0 --- .../weatherchanger/mixin/WorldMixin.java | 42 +++++++++++++++++++ gradle.properties | 2 +- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/me/lucaslah/weatherchanger/mixin/WorldMixin.java b/common/src/main/java/me/lucaslah/weatherchanger/mixin/WorldMixin.java index 2d72945..1ea424b 100644 --- a/common/src/main/java/me/lucaslah/weatherchanger/mixin/WorldMixin.java +++ b/common/src/main/java/me/lucaslah/weatherchanger/mixin/WorldMixin.java @@ -2,14 +2,21 @@ package me.lucaslah.weatherchanger.mixin; import me.lucaslah.weatherchanger.WeatherChanger; import me.lucaslah.weatherchanger.config.WcMode; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; +import net.minecraft.world.dimension.DimensionType; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +@Environment(EnvType.CLIENT) @Mixin(World.class) public class WorldMixin { @Shadow @@ -21,6 +28,23 @@ public class WorldMixin { @Shadow protected float thunderGradient; + @Shadow @Final private RegistryEntry dimensionEntry; + + @Unique + private float weatherChanger$getRainGradientOg(float delta) { + return MathHelper.lerp(delta, this.rainGradientPrev, this.rainGradient); + } + + @Unique + private float weatherChanger$getThunderGradientOg(float delta) { + return MathHelper.lerp(delta, this.thunderGradientPrev, this.thunderGradient) * this.weatherChanger$getRainGradientOg(delta); + } + + @Unique + public DimensionType weatherChanger$getDimension() { + return this.dimensionEntry.value(); + } + @Inject(method = "getRainGradient", at = @At("HEAD"), cancellable = true) public void getRainGradient(float delta, CallbackInfoReturnable callback) { WcMode mode = WeatherChanger.getMode(); @@ -50,4 +74,22 @@ public class WorldMixin { callback.cancel(); } + + @Inject(method = "isRaining", at = @At("HEAD"), cancellable = true) + public void isRaining(CallbackInfoReturnable callback) { + callback.setReturnValue((double)this.weatherChanger$getRainGradientOg(1.0F) > 0.2); + callback.cancel(); + } + + @Inject(method = "isThundering", at = @At("HEAD"), cancellable = true) + public void isThundering(CallbackInfoReturnable callback) { + + if (this.weatherChanger$getDimension().hasSkyLight() && !(this.weatherChanger$getDimension().hasCeiling())) { + callback.setReturnValue((double)this.weatherChanger$getThunderGradientOg(1.0F) > 0.9); + } else { + callback.setReturnValue(false); + } + + callback.cancel(); + } } diff --git a/gradle.properties b/gradle.properties index 08d8e5b..a4c36a5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,7 +13,7 @@ yarn_mappings=1.21+build.7 enabled_platforms=fabric,forge # Mod Properties -mod_version = 1.1.0 +mod_version = 1.2.0 mod_id = weatherchanger maven_group = me.lucaslah.weatherchanger archives_base_name = weather-changer