mirror of
https://github.com/Lucaslah/WeatherChanger.git
synced 2026-01-12 00:49:54 +00:00
Compare commits
8 Commits
1.1.0
...
release/1.
| Author | SHA1 | Date | |
|---|---|---|---|
| 80d34ab146 | |||
| 0e4c5e1036 | |||
|
99f504b9ca
|
|||
| ac040b84cd | |||
|
37645401e3
|
|||
|
8c344ec47d
|
|||
|
|
2dc3d64ca1 | ||
|
|
c5f5a278e3 |
BIN
CHANGELOG.md
BIN
CHANGELOG.md
Binary file not shown.
44
README.md
44
README.md
@@ -28,59 +28,37 @@ 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.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.*
|
||||
|
||||
@@ -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.7.+" 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> {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
architectury {
|
||||
injectInjectables = false
|
||||
common(rootProject.property("enabled_platforms").toString().split(","))
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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<DimensionType> 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<Float> 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<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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,8 @@
|
||||
"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",
|
||||
|
||||
@@ -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": "Переключить дождливую погоду",
|
||||
|
||||
@@ -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": "Яңгырлы һава торышын күчерү",
|
||||
|
||||
@@ -10,5 +10,6 @@
|
||||
],
|
||||
"injectors": {
|
||||
"defaultRequire": 1
|
||||
}
|
||||
},
|
||||
"refmap": "weatherchanger-common-common-refmap.json"
|
||||
}
|
||||
@@ -55,6 +55,8 @@ tasks {
|
||||
rename { "assets/weatherchanger/icon.png" }
|
||||
}
|
||||
|
||||
rename("common-common-refmap.json", "weatherchanger-common-common-refmap.json")
|
||||
|
||||
dependsOn(":common:transformProductionFabric")
|
||||
|
||||
from({
|
||||
|
||||
@@ -62,6 +62,8 @@ tasks {
|
||||
rename { "icon.png" }
|
||||
}
|
||||
|
||||
rename("common-common-refmap.json", "weatherchanger-common-common-refmap.json")
|
||||
|
||||
dependsOn(":common:transformProductionForge")
|
||||
|
||||
from({
|
||||
|
||||
@@ -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.2
|
||||
mod_id = weatherchanger
|
||||
maven_group = me.lucaslah.weatherchanger
|
||||
archives_base_name = weather-changer
|
||||
|
||||
Reference in New Issue
Block a user