9 Commits

Author SHA1 Message Date
cdf5cd5d95 Version 1.3.0-beta1 (Fabric) (#17)
* [1.3.0-beta1] Update to 1.21.11

* Fix deploy workflow
2025-12-10 18:21:53 +13:00
80d34ab146 Update README (#16)
* Update README

* Remove new release

* 1.21.0 => 1.21

* Improve wording
2025-12-10 11:13:01 +13:00
0e4c5e1036 Fix issue with refmap naming (#14)
* Fix issue with refmap naming

* Update README
2025-06-20 14:42:20 +12:00
99f504b9ca docs: fix release tag link for v1.2.1 2024-12-16 13:40:40 +13:00
ac040b84cd fix: update to loom 1.7 to fix forge crashing on launch (#12)
This commit also releases Weather Changer v1.2.1
2024-12-16 13:28:39 +13:00
37645401e3 docs: add version 1.2.0 to README 2024-10-21 19:28:44 +13:00
8c344ec47d 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
2024-10-21 19:05:51 +13:00
Amirhan-Taipovjan-Greatest-I
2dc3d64ca1 Actualized Tatar and Russian Translations! (#9)
* Actualized Vanilla-ish Tatar Translation!

* Updated ≈Vanilla-ish Russian Translation!
2024-08-18 14:00:50 +12:00
Thierry Schmid
c5f5a278e3 Timer functionality as suggested a month ago (#7)
* first implementation of timer

* first implementation of timer

* String message turned to a translatable text
2024-08-10 22:34:26 +12:00
26 changed files with 189 additions and 100 deletions

View File

@@ -43,8 +43,8 @@ jobs:
- name: Create Release
run: |
mkdir dist
mv build/fabric/build/libs/*.jar dist
mv build/forge/build/libs/*.jar dist
shopt -s nullglob
mv build/{fabric,forge}/build/libs/*.jar dist/
pushd dist
shasum -a 256 * > checksums.txt
@@ -59,4 +59,8 @@ jobs:
--generate-notes
)
if [[ "$channel" == "alpha" || "$channel" == "beta" ]]; then
release_args+=( --prerelease )
fi
gh release create "${release_args[@]}" ./dist/*

Binary file not shown.

View File

@@ -28,59 +28,38 @@ Supports forge and fabric, requires the [Fabric API](https://modrinth.com/mod/P7
The command alias `/cweather` may also be used as a shortcut.
### Keybindings
To set the keybindings you can do so in the minecraft keybinding settings.
If you would like to set the keybindings, you can do so in the minecraft keybinding settings.
| Description | Default |
|----------------------------------------------------------------------------------|---------|
| Disable the client weather (weather will display the server weather like normal) | Unbound |
| Set the client weather mod to clear | Unbound |
| Set the client weather mod to rain | Unbound |
| Set the client weather mod to thunder | Unbound |
For supported mod loaders and minecraft versions see [release history](#release-history)
| Set the client weather mod to thunder | Unbound |
<!-- modrinth_exclude.start -->
## Download
You can download the mod from any of the platforms below.
**Modrinth (_recommended_)**: https://modrinth.com/mod/weather-changer <br>
**Curseforge**: https://www.curseforge.com/minecraft/mc-mods/weather-changer <br>
**Modrinth**: https://modrinth.com/mod/weather-changer <br>
**GitHub Releases:** https://github.com/Lucaslah/WeatherChanger/releases <br>
<!-- modrinth_exclude.end -->
## Release History
| Version | MC Version | Mod loaders | Git Tag | Supported |
|---------|---------------|---------------|------------------------------------------------------------------------|-----------|
| v1.1.0 | 1.21 | fabric | [1.1.0](https://github.com/Lucaslah/WeatherChanger/releases/tag/1.1.0) | Yes |
| v1.0.1 | 1.20.1-1.20.6 | fabric, forge | [1.0.1](https://github.com/Lucaslah/WeatherChanger/releases/tag/1.0.1) | Yes |
| v1.0.0 | 1.20.1-1.20.4 | fabric, forge | [1.0.0](https://github.com/Lucaslah/WeatherChanger/releases/tag/1.0.0) | No |
## Supported Versions
### Pre-release (v0) versions
| Version | MC Version | Mod loaders | Git Tag | Supported |
|---------|---------------|-------------|------------------------------------------------------------------------|-----------|
| v0.3.0 | 1.20.1-1.20.4 | fabric | [0.3.0](https://github.com/Lucaslah/WeatherChanger/releases/tag/0.3.0) | No |
| v0.2.0 | 1.19.3 | fabric | [0.2.0](https://github.com/Lucaslah/WeatherChanger/releases/tag/0.2.0) | No |
| v0.1.0 | 1.19.1-1.19.2 | fabric | [0.1.0](https://github.com/Lucaslah/WeatherChanger/releases/tag/0.1.0) | No |
Supported versions may receive bug fixes,
older Minecraft versions may work with older
Weather Changer versions, but are not supported.
## Minecraft Versions
| Version | Status |
|---------|---------------------------------|
| 1.21 | Supported |
| 1.20.6 | Supported |
| 1.20.5 | Supported |
| 1.20.4 | Supported |
| 1.20.3 | Supported |
| 1.20.2 | Supported |
| 1.20.1 | Supported |
| 1.20 | Not Supported (available in v0) |
| 1.19.4 | Not Supported (available in v0) |
| 1.19.3 | Not Supported (available in v0) |
| 1.19.2 | Not Supported (available in v0) |
| 1.19.1 | Not Supported (available in v0) |
See the [GitHub releases](https://github.com/Lucaslah/WeatherChanger/releases) page for full release history.
*Older versions may be added on request*
| Weather Changer Version | Minecraft Version | Mod loaders | Latest Release |
|-------------------------|-------------------|---------------|------------------------------------------------------------------------------------|
| v1.3.x | 1.21.11 | Fabric, Forge | [1.3.0-beta1](https://github.com/Lucaslah/WeatherChanger/releases/tag/1.3.0-beta1) |
| v1.2.x | 1.21-1.21.10 | Fabric, Forge | [1.2.2](https://github.com/Lucaslah/WeatherChanger/releases/tag/1.2.2) |
------------------------------------------
*Licensed under the [GNU Lesser General Public License v3.0](https://www.gnu.org/licenses/lgpl-3.0.en.html) license.*

View File

@@ -3,11 +3,10 @@ import net.fabricmc.loom.task.RemapSourcesJarTask
plugins {
id("architectury-plugin") version "3.4.+"
id ("dev.architectury.loom") version "1.6.+" apply false
id("dev.architectury.loom") version "1.13.+" apply false
}
architectury {
injectInjectables = false
minecraft = properties["minecraft_version"].toString()
}
@@ -23,7 +22,7 @@ subprojects {
tasks.withType<JavaCompile> {
options.encoding = "UTF-8"
options.release.set(17)
options.release.set(21)
}
tasks.withType<Jar> {

View File

@@ -1,4 +1,5 @@
architectury {
injectInjectables = false
common(rootProject.property("enabled_platforms").toString().split(","))
}

View File

@@ -11,6 +11,7 @@ import me.lucaslah.weatherchanger.keys.ToggleClearKey;
import me.lucaslah.weatherchanger.keys.ToggleOffKey;
import me.lucaslah.weatherchanger.keys.ToggleRainKey;
import me.lucaslah.weatherchanger.keys.ToggleThunderKey;
import me.lucaslah.weatherchanger.timerlogic.Timer;
import net.minecraft.client.MinecraftClient;
import net.minecraft.text.Text;
@@ -27,6 +28,8 @@ public class WeatherChanger {
private static WeatherChangerPlatform platform;
private static KeybindingManager keybindingManager;
private static CommandManager commandManager;
private static Timer weatherTimer;
private static boolean timerEnabled = false; // Default to false
public static void init(WeatherChangerPlatform platform) {
WeatherChanger.platform = platform;
@@ -57,6 +60,8 @@ public class WeatherChanger {
.add(new ToggleThunderKey());
commandManager.add(new WeatherChangerCommand());
weatherTimer = new Timer();
}
private static void loadConfig() {
@@ -151,4 +156,12 @@ public class WeatherChanger {
public static void sendClientMessage(Text message) {
MinecraftClient.getInstance().inGameHud.getChatHud().addMessage(message);
}
public static void toggleTimer() {
timerEnabled = !timerEnabled;
}
public static boolean isTimerEnabled() {
return timerEnabled;
}
}

View File

@@ -48,6 +48,15 @@ public class WeatherChangerCommand extends Command {
})
);
command.then(LiteralArgumentBuilder.<T>literal("toggleTimer")
.executes(context -> {
WeatherChanger.toggleTimer();
Text message = WeatherChanger.isTimerEnabled() ? Text.translatable("commands.weatherchanger.timer.on") : Text.translatable("commands.weatherchanger.timer.off");
sendClientMessage(message);
return 1;
})
);
LiteralCommandNode<T> node = dispatcher.register(command);
dispatcher.register(LiteralArgumentBuilder.<T>literal("cweather").redirect(node));
}

View File

@@ -10,8 +10,10 @@ public abstract class Key {
public KeyBinding keybind;
public MinecraftClient mc = MinecraftClient.getInstance();
public Key(@NotNull String name) {
keybind = new KeyBinding(this.getDisplayName(), this.getKeyType(), this.getKey(), this.getCategory());
private static final KeyBinding.Category CATEGORY = KeyBinding.Category.create(Identifier.of("weatherchanger"));
public Key() {
keybind = new KeyBinding(this.getDisplayName(), this.getKeyType(), this.getKey(), CATEGORY);
}
public abstract void onPress(@NotNull MinecraftClient client);
@@ -20,6 +22,5 @@ public abstract class Key {
public abstract boolean isEnabled();
public abstract String getDisplayName();
public abstract InputUtil.Type getKeyType();
public abstract String getCategory();
public abstract int getKey();
}

View File

@@ -12,10 +12,6 @@ import net.minecraft.util.Identifier;
import org.jetbrains.annotations.NotNull;
public class ToggleClearKey extends Key {
public ToggleClearKey() {
super("ToggleClearKey");
}
@Override
public void onPress(@NotNull MinecraftClient client) {
WeatherChanger.setMode(WcMode.CLEAR);
@@ -48,11 +44,6 @@ public class ToggleClearKey extends Key {
return InputUtil.Type.KEYSYM;
}
@Override
public String getCategory() {
return "Weather Changer";
}
@Override
public int getKey() {
return -1;

View File

@@ -12,10 +12,6 @@ import net.minecraft.util.Identifier;
import org.jetbrains.annotations.NotNull;
public class ToggleOffKey extends Key {
public ToggleOffKey() {
super("ToggleOffKey");
}
@Override
public void onPress(@NotNull MinecraftClient client) {
WeatherChanger.setMode(WcMode.OFF);
@@ -48,11 +44,6 @@ public class ToggleOffKey extends Key {
return InputUtil.Type.KEYSYM;
}
@Override
public String getCategory() {
return "Weather Changer";
}
@Override
public int getKey() {
return -1;

View File

@@ -12,10 +12,6 @@ import net.minecraft.util.Identifier;
import org.jetbrains.annotations.NotNull;
public class ToggleRainKey extends Key {
public ToggleRainKey() {
super("ToggleRainKey");
}
@Override
public void onPress(@NotNull MinecraftClient client) {
WeatherChanger.setMode(WcMode.RAIN);
@@ -48,11 +44,6 @@ public class ToggleRainKey extends Key {
return InputUtil.Type.KEYSYM;
}
@Override
public String getCategory() {
return "Weather Changer";
}
@Override
public int getKey() {
return -1;

View File

@@ -12,10 +12,6 @@ import net.minecraft.util.Identifier;
import org.jetbrains.annotations.NotNull;
public class ToggleThunderKey extends Key {
public ToggleThunderKey() {
super("ToggleThunderKey");
}
@Override
public void onPress(@NotNull MinecraftClient client) {
WeatherChanger.setMode(WcMode.THUNDER);
@@ -48,11 +44,6 @@ public class ToggleThunderKey extends Key {
return InputUtil.Type.KEYSYM;
}
@Override
public String getCategory() {
return "Weather Changer";
}
@Override
public int getKey() {
return -1;

View File

@@ -2,25 +2,49 @@ 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
protected float rainGradientPrev;
protected float lastRainGradient;
@Shadow
protected float rainGradient;
@Shadow
protected float thunderGradientPrev;
protected float lastThunderGradient;
@Shadow
protected float thunderGradient;
@Shadow @Final private RegistryEntry<DimensionType> dimensionEntry;
@Unique
private float weatherChanger$getRainGradientOg(float delta) {
return MathHelper.lerp(delta, this.lastRainGradient, this.rainGradient);
}
@Unique
private float weatherChanger$getThunderGradientOg(float delta) {
return MathHelper.lerp(delta, this.lastThunderGradient, 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<Float> callback) {
WcMode mode = WeatherChanger.getMode();
@@ -30,7 +54,7 @@ public class WorldMixin {
} else if (mode == WcMode.RAIN || mode == WcMode.THUNDER) {
callback.setReturnValue(1F);
} else {
callback.setReturnValue(MathHelper.lerp(delta, this.rainGradientPrev, this.rainGradient));
callback.setReturnValue(MathHelper.lerp(delta, this.lastRainGradient, this.rainGradient));
}
callback.cancel();
@@ -45,7 +69,24 @@ public class WorldMixin {
} else if (mode == WcMode.THUNDER) {
callback.setReturnValue(1F);
} else {
callback.setReturnValue(MathHelper.lerp(delta, this.thunderGradientPrev, this.thunderGradient) * MathHelper.lerp(delta, this.rainGradientPrev, this.rainGradient));
callback.setReturnValue(MathHelper.lerp(delta, this.lastThunderGradient, this.thunderGradient) * MathHelper.lerp(delta, this.lastRainGradient, this.rainGradient));
}
callback.cancel();
}
@Inject(method = "isRaining", at = @At("HEAD"), cancellable = true)
public void isRaining(CallbackInfoReturnable<Boolean> 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<Boolean> 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();

View File

@@ -0,0 +1,66 @@
package me.lucaslah.weatherchanger.timerlogic;
import me.lucaslah.weatherchanger.WeatherChanger;
import me.lucaslah.weatherchanger.config.WcMode;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.Random;
public class Timer {
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
private final Random random = new Random();
public Timer() {
scheduleWeatherChange();
scheduleWeatherIntensityAdjustment();
}
private void scheduleWeatherChange() {
int initialDelay = 0; // Start immediately
int delay = 20 + random.nextInt(11); // 20-30 minutes
scheduler.scheduleWithFixedDelay(this::decideWeather, initialDelay, delay, TimeUnit.MINUTES);
}
private void decideWeather() {
if (!WeatherChanger.isTimerEnabled()) return;
if (random.nextDouble() < 0.75) { // 75% chance to change the weather
if (random.nextDouble() < 0.66) { // 66% chance for rain
WeatherChanger.setMode(WcMode.RAIN);
} else { // 33% chance for thunderstorm
WeatherChanger.setMode(WcMode.THUNDER);
}
}
}
private void scheduleWeatherIntensityAdjustment() {
int initialDelay = 1; // Start after 1 minute
int delay = 1 + random.nextInt(2); // 1-2 minutes
scheduler.scheduleWithFixedDelay(this::adjustWeatherIntensity, initialDelay, delay, TimeUnit.MINUTES);
}
private void adjustWeatherIntensity() {
if (!WeatherChanger.isTimerEnabled()) return;
WcMode currentMode = WeatherChanger.getMode();
double chance = random.nextDouble();
if (currentMode == WcMode.RAIN) {
if (chance < 0.05) { // 5% chance to worsen from rain to thunderstorm
WeatherChanger.setMode(WcMode.THUNDER);
} else if (chance < 0.20) { // 15% chance to clear up from rain
WeatherChanger.setMode(WcMode.CLEAR);
}
} else if (currentMode == WcMode.THUNDER) {
if (chance < 0.05) { // 5% chance to worsen, but already at worst so no change
// No change
} else if (chance < 0.20) { // 15% chance to improve from thunderstorm to rain
WeatherChanger.setMode(WcMode.RAIN);
}
} else if (currentMode == WcMode.CLEAR) {
// No change, clear weather cannot improve or worsen in this context
}
}
}

View File

@@ -1,8 +1,11 @@
{
"key.category.minecraft.weatherchanger": "Weather Changer",
"commands.weatherchanger.set.off": "Set client weather to: Off",
"commands.weatherchanger.set.clear": "Set client weather to: Clear",
"commands.weatherchanger.set.rain": "Set client weather to: Rain",
"commands.weatherchanger.set.thunder": "Set client weather to: Thunder",
"commands.weatherchanger.timer.on": "Timer enabled",
"commands.weatherchanger.timer.off": "Timer disabled",
"keys.weatherchanger.off.name": "Toggle Weather Off",
"keys.weatherchanger.clear.name": "Toggle Weather Clear",
"keys.weatherchanger.rain.name": "Toggle Weather Rain",

View File

@@ -4,6 +4,8 @@
"commands.weatherchanger.set.clear": "Установлена клиентская погода: Ясная",
"commands.weatherchanger.set.rain": "Установлена клиентская погода: Дождливая",
"commands.weatherchanger.set.thunder": "Установлена клиентская погода: Гроза и дождь",
"commands.weatherchanger.timer.on": "Таймер включен",
"commands.weatherchanger.timer.off": "Таймер выключен",
"keys.weatherchanger.off.name": "Выключить клиентскую погоду",
"keys.weatherchanger.clear.name": "Переключить ясную погоду",
"keys.weatherchanger.rain.name": "Переключить дождливую погоду",

View File

@@ -5,6 +5,8 @@
"commands.weatherchanger.set.clear": "Клиентлы һава торышы урнаштырылды: Аяз",
"commands.weatherchanger.set.rain": "Клиентлы һава торышы урнаштырылды: Яңгырлы",
"commands.weatherchanger.set.thunder": "Клиентлы һава торышы урнаштырылды: Яшенле һәм яңгырлы",
"commands.weatherchanger.timer.on": "Таймер кушык",
"commands.weatherchanger.timer.off": "Таймер сүнек",
"keys.weatherchanger.off.name": "Клиентлы һава торышын сүндерү",
"keys.weatherchanger.clear.name": "Аяз һава торышын күчерү",
"keys.weatherchanger.rain.name": "Яңгырлы һава торышын күчерү",

View File

@@ -10,5 +10,6 @@
],
"injectors": {
"defaultRequire": 1
}
},
"refmap": "weatherchanger-common-common-refmap.json"
}

View File

@@ -55,6 +55,8 @@ tasks {
rename { "assets/weatherchanger/icon.png" }
}
rename("common-common-refmap.json", "weatherchanger-common-common-refmap.json")
dependsOn(":common:transformProductionFabric")
from({

View File

@@ -62,6 +62,8 @@ tasks {
rename { "icon.png" }
}
rename("common-common-refmap.json", "weatherchanger-common-common-refmap.json")
dependsOn(":common:transformProductionForge")
from({

View File

@@ -5,15 +5,15 @@ org.gradle.jvmargs=-Xmx2G
kotlin.code.style=official
# Minecraft Properties
minecraft_version=1.21
minecraft_version=1.21.11
minecraft_base=1.21
yarn_mappings=1.21+build.7
yarn_mappings=1.21.11+build.1
# Architectury Properties
enabled_platforms=fabric,forge
# Mod Properties
mod_version = 1.1.0
mod_version = 1.3.0-beta1
mod_id = weatherchanger
maven_group = me.lucaslah.weatherchanger
archives_base_name = weather-changer
@@ -23,8 +23,8 @@ archives_base_name = weather-changer
release_channel=release
# Fabric
fabric.loader_version=0.15.11
fabric.version=0.100.1+1.21
fabric.loader_version=0.18.2
fabric.version=0.139.4+1.21.11
# Forge
forge.version=1.21-51.0.21

Binary file not shown.

View File

@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

2
gradlew vendored
View File

@@ -55,7 +55,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.

20
gradlew.bat vendored
View File

@@ -43,11 +43,11 @@ set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
@@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail

View File

@@ -38,4 +38,4 @@ gradleEnterprise {
include("common")
include("fabric")
include("forge")
//include("forge")