diff --git a/gradle.properties b/gradle.properties index a2c5fd8..1457fce 100755 --- a/gradle.properties +++ b/gradle.properties @@ -3,15 +3,15 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/develop/ - minecraft_version=1.19 - yarn_mappings=1.19+build.4 - loader_version=0.14.8 + minecraft_version=1.19.4 + yarn_mappings=1.19.4+build.2 + loader_version=0.14.19 # Mod Properties - mod_version = 1.2.0 + mod_version = 1.3.0 maven_group = eu.midnightdust archives_base_name = timechanger # Dependencies - fabric_version=0.56.0+1.19 - midnightlib_version = 0.5.2 \ No newline at end of file + fabric_version=0.81.1+1.19.4 + midnightlib_version=1.3.0-fabric \ No newline at end of file diff --git a/src/main/java/eu/midnightdust/timechanger/TimeChangerClient.java b/src/main/java/eu/midnightdust/timechanger/TimeChangerClient.java index 3b43345..0b5c264 100755 --- a/src/main/java/eu/midnightdust/timechanger/TimeChangerClient.java +++ b/src/main/java/eu/midnightdust/timechanger/TimeChangerClient.java @@ -1,18 +1,32 @@ package eu.midnightdust.timechanger; import eu.midnightdust.timechanger.command.CTimeCommand; +import eu.midnightdust.timechanger.command.CWeatherCommand; import eu.midnightdust.timechanger.config.TimeChangerConfig; import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import net.minecraft.client.MinecraftClient; public class TimeChangerClient implements ClientModInitializer { + private static MinecraftClient client = MinecraftClient.getInstance(); @Override public void onInitializeClient() { TimeChangerConfig.init("timechanger", TimeChangerConfig.class); - if (ClientCommandManager.getActiveDispatcher() != null) - ClientCommandManager.getActiveDispatcher().register(ClientCommandManager.literal("ctime") - .then(CTimeCommand.command()) - ); + ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(CTimeCommand.command())); + ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(CWeatherCommand.command())); + } + public static boolean isEnabledOnWorld() { + if (client.getCurrentServerEntry() != null) { + if (TimeChangerConfig.allowlist.isEmpty()) { + return true; + } else if (client.getCurrentServerEntry().address != null) { + if (!TimeChangerConfig.blocklist && TimeChangerConfig.allowlist.contains(client.getCurrentServerEntry().address)) { + return true; + } else return TimeChangerConfig.blocklist && !TimeChangerConfig.allowlist.contains(client.getCurrentServerEntry().address); + } + return false; + } + return TimeChangerConfig.enableInSingleplayer; } } diff --git a/src/main/java/eu/midnightdust/timechanger/command/CTimeCommand.java b/src/main/java/eu/midnightdust/timechanger/command/CTimeCommand.java index 28b3d55..c8ed30a 100755 --- a/src/main/java/eu/midnightdust/timechanger/command/CTimeCommand.java +++ b/src/main/java/eu/midnightdust/timechanger/command/CTimeCommand.java @@ -12,7 +12,7 @@ import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.arg public class CTimeCommand { public static LiteralArgumentBuilder command() { - return ClientCommandManager.literal("set").then( + return ClientCommandManager.literal("ctime").then( argument("time", IntegerArgumentType.integer(-1)) .executes(ctx -> setTime(ctx.getSource(), IntegerArgumentType.getInteger(ctx, "time"))) ); @@ -22,7 +22,7 @@ public class CTimeCommand { TimeChangerConfig.custom_time = time; TimeChangerConfig.write("timechanger"); - source.sendFeedback(Text.translatable("command.timechanger.ctime.success").append(String.valueOf(time))); + source.sendFeedback(Text.translatable("command.timechanger.ctime.success").append(time >= 0 ? String.valueOf(time) : "disabled")); return 1; } diff --git a/src/main/java/eu/midnightdust/timechanger/command/CWeatherCommand.java b/src/main/java/eu/midnightdust/timechanger/command/CWeatherCommand.java new file mode 100755 index 0000000..2dcb598 --- /dev/null +++ b/src/main/java/eu/midnightdust/timechanger/command/CWeatherCommand.java @@ -0,0 +1,29 @@ +package eu.midnightdust.timechanger.command; + +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import eu.midnightdust.timechanger.config.TimeChangerConfig; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.minecraft.text.Text; + +import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; + +public class CWeatherCommand { + + public static LiteralArgumentBuilder command() { + return ClientCommandManager.literal("cweather") + .then(literal("unset").executes(ctx -> setWeather(ctx.getSource(), TimeChangerConfig.Weather.UNSET))) + .then(literal("clear").executes(ctx -> setWeather(ctx.getSource(), TimeChangerConfig.Weather.CLEAR))) + .then(literal("rain").executes(ctx -> setWeather(ctx.getSource(), TimeChangerConfig.Weather.RAIN))) + .then(literal("thunder").executes(ctx -> setWeather(ctx.getSource(), TimeChangerConfig.Weather.THUNDER))); + } + + private static int setWeather(FabricClientCommandSource source, TimeChangerConfig.Weather weather) { + TimeChangerConfig.custom_weather = weather; + TimeChangerConfig.write("timechanger"); + + source.sendFeedback(Text.translatable("command.timechanger.cweather.success").append(String.valueOf(weather))); + return 1; + } + +} \ No newline at end of file diff --git a/src/main/java/eu/midnightdust/timechanger/config/TimeChangerConfig.java b/src/main/java/eu/midnightdust/timechanger/config/TimeChangerConfig.java index 8c66e69..8df4daf 100644 --- a/src/main/java/eu/midnightdust/timechanger/config/TimeChangerConfig.java +++ b/src/main/java/eu/midnightdust/timechanger/config/TimeChangerConfig.java @@ -6,7 +6,13 @@ import java.util.ArrayList; import java.util.List; public class TimeChangerConfig extends MidnightConfig { - @Entry public static int custom_time = -1; + @Entry(isSlider = true, min = -1, max = 24000) public static int custom_time = -1; + @Entry public static Weather custom_weather = Weather.UNSET; @Entry public static List allowlist = new ArrayList<>(); @Entry public static boolean blocklist = false; + @Entry public static boolean enableInSingleplayer = false; + + public enum Weather { + UNSET, CLEAR, RAIN, THUNDER; + } } diff --git a/src/main/java/eu/midnightdust/timechanger/mixin/MixinClientWorld.java b/src/main/java/eu/midnightdust/timechanger/mixin/MixinClientWorld.java index 7eece60..02f744a 100644 --- a/src/main/java/eu/midnightdust/timechanger/mixin/MixinClientWorld.java +++ b/src/main/java/eu/midnightdust/timechanger/mixin/MixinClientWorld.java @@ -1,40 +1,43 @@ package eu.midnightdust.timechanger.mixin; +import eu.midnightdust.timechanger.TimeChangerClient; import eu.midnightdust.timechanger.config.TimeChangerConfig; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.MinecraftClient; import net.minecraft.client.world.ClientWorld; -import org.spongepowered.asm.mixin.Final; +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.util.profiler.Profiler; +import net.minecraft.world.MutableWorldProperties; +import net.minecraft.world.World; +import net.minecraft.world.dimension.DimensionType; 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 java.util.function.Supplier; @Mixin(ClientWorld.class) -public abstract class MixinClientWorld { +public abstract class MixinClientWorld extends World { - @Shadow @Final private ClientWorld.Properties clientWorldProperties; - @Shadow @Final private MinecraftClient client; - - @Inject(at = @At("TAIL"), method = "setTimeOfDay", cancellable = true) - @Environment(EnvType.CLIENT) - public void setTimeOfDay(long time, CallbackInfo ci) { - if (client.getCurrentServerEntry() != null) { - if (TimeChangerConfig.custom_time >= 0 && TimeChangerConfig.allowlist.isEmpty()) { - this.clientWorldProperties.setTimeOfDay(TimeChangerConfig.custom_time); - } else if (TimeChangerConfig.custom_time >= 0 && client.getCurrentServerEntry().address != null) { - if (!TimeChangerConfig.blocklist && TimeChangerConfig.allowlist.contains(client.getCurrentServerEntry().address)) { - this.clientWorldProperties.setTimeOfDay(TimeChangerConfig.custom_time); - } else if (TimeChangerConfig.blocklist && !TimeChangerConfig.allowlist.contains(client.getCurrentServerEntry().address)) { - this.clientWorldProperties.setTimeOfDay(TimeChangerConfig.custom_time); - } - else {ci.cancel();} - } - else {ci.cancel();} + protected MixinClientWorld(MutableWorldProperties properties, RegistryKey registryRef, DynamicRegistryManager registryManager, RegistryEntry dimensionEntry, Supplier profiler, boolean isClient, boolean debugWorld, long biomeAccess, int maxChainedNeighborUpdates) { + super(properties, registryRef, registryManager, dimensionEntry, profiler, isClient, debugWorld, biomeAccess, maxChainedNeighborUpdates); + } + @Override + public float getRainGradient(float delta) { + if (TimeChangerClient.isEnabledOnWorld() && !TimeChangerConfig.custom_weather.equals(TimeChangerConfig.Weather.UNSET)) { + if (TimeChangerConfig.custom_weather.equals(TimeChangerConfig.Weather.CLEAR)) { + return 0f; + } else return 1f; } - else {ci.cancel();} + return super.getRainGradient(delta); + } + + @Override + public float getThunderGradient(float delta) { + if (TimeChangerClient.isEnabledOnWorld() && !TimeChangerConfig.custom_weather.equals(TimeChangerConfig.Weather.UNSET)) { + if (TimeChangerConfig.custom_weather.equals(TimeChangerConfig.Weather.THUNDER)) { + return 1f; + } else return 0f; + } + return super.getRainGradient(delta); } } diff --git a/src/main/java/eu/midnightdust/timechanger/mixin/MixinClientWorldProperties.java b/src/main/java/eu/midnightdust/timechanger/mixin/MixinClientWorldProperties.java new file mode 100644 index 0000000..1362d55 --- /dev/null +++ b/src/main/java/eu/midnightdust/timechanger/mixin/MixinClientWorldProperties.java @@ -0,0 +1,25 @@ +package eu.midnightdust.timechanger.mixin; + +import eu.midnightdust.timechanger.TimeChangerClient; +import eu.midnightdust.timechanger.config.TimeChangerConfig; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.world.ClientWorld; +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; + +@Mixin(ClientWorld.Properties.class) + +public abstract class MixinClientWorldProperties { + + @Inject(at = @At("RETURN"), method = "getTimeOfDay", cancellable = true) + @Environment(EnvType.CLIENT) + public void getTimeOfDay(CallbackInfoReturnable cir) { + if (TimeChangerClient.isEnabledOnWorld() && TimeChangerConfig.custom_time >= 0) { + cir.setReturnValue((long) TimeChangerConfig.custom_time); + } + else cir.cancel(); + } +} diff --git a/src/main/resources/assets/timechanger/lang/en_us.json b/src/main/resources/assets/timechanger/lang/en_us.json index ee770f9..741c308 100755 --- a/src/main/resources/assets/timechanger/lang/en_us.json +++ b/src/main/resources/assets/timechanger/lang/en_us.json @@ -2,7 +2,15 @@ "timechanger.midnightconfig.title":"Time Changer Config", "timechanger.midnightconfig.custom_time":"Custom Time", "timechanger.midnightconfig.custom_time.tooltip": "Set the Custom Time (-1 to disable)", + "timechanger.midnightconfig.custom_weather":"Custom Weather", + "timechanger.midnightconfig.custom_weather.tooltip": "Set the Custom Time (Unset to disable)", + "timechanger.midnightconfig.enum.Weather.UNSET":"Unset", + "timechanger.midnightconfig.enum.Weather.CLEAR":"Clear", + "timechanger.midnightconfig.enum.Weather.RAIN":"Rain", + "timechanger.midnightconfig.enum.Weather.THUNDER":"Thunder", "timechanger.midnightconfig.allowlist":"Server Allowlist", "timechanger.midnightconfig.blocklist":"Use Allowlist as Blocklist?", - "command.timechanger.ctime.success": "Successfully set the client time to " + "timechanger.midnightconfig.enableInSingleplayer":"Enable in Singleplayer?", + "command.timechanger.ctime.success": "Successfully set the client time to ", + "command.timechanger.cweather.success": "Successfully set the client weather to " } diff --git a/src/main/resources/timechanger.mixins.json b/src/main/resources/timechanger.mixins.json index b3ae5ca..e8110dd 100644 --- a/src/main/resources/timechanger.mixins.json +++ b/src/main/resources/timechanger.mixins.json @@ -1,9 +1,10 @@ { "required": true, "package": "eu.midnightdust.timechanger.mixin", - "compatibilityLevel": "JAVA_8", + "compatibilityLevel": "JAVA_17", "client": [ - "MixinClientWorld" + "MixinClientWorld", + "MixinClientWorldProperties" ], "injectors": { "defaultRequire": 1