From d0ab594cf555bf0d582718800b659389dadb62af Mon Sep 17 00:00:00 2001 From: Jaffe2718 Date: Wed, 25 Jun 2025 21:55:16 +0800 Subject: [PATCH] 2.0.1-rc.1 1. support mc 1.21.6 2. add shooting star phare animation --- build.gradle | 2 +- .../celestria/CelestriaClient.java | 2 +- .../midnightdust/celestria/ShootingStar.java | 22 +++++++ .../celestria/config/CelestriaConfig.java | 1 + .../celestria/mixin/MixinSkyRendering.java | 21 ++++++ .../celestria/mixin/MixinWorldRenderer.java | 28 -------- .../render/ShootingStarRenderer.java | 62 ------------------ .../render/ShootingStarRendering.java | 50 ++++++++++++++ .../assets/celestria/lang/en_us.json | 1 + .../assets/celestria/lang/ru_ru.json | 30 +++++---- .../textures/environment/shooting_star1.png | Bin 5161 -> 2039 bytes .../textures/environment/shooting_star2.png | Bin 5352 -> 2037 bytes .../textures/environment/shooting_star3.png | Bin 5389 -> 2056 bytes .../textures/environment/shooting_star4.png | Bin 5589 -> 2057 bytes .../src/main/resources/celestria.mixins.json | 2 +- gradle.properties | 23 +++---- gradle/wrapper/gradle-wrapper.properties | 2 +- .../resources/META-INF/neoforge.mods.toml | 4 +- 18 files changed, 130 insertions(+), 120 deletions(-) create mode 100644 common/src/main/java/eu/midnightdust/celestria/mixin/MixinSkyRendering.java delete mode 100644 common/src/main/java/eu/midnightdust/celestria/mixin/MixinWorldRenderer.java delete mode 100644 common/src/main/java/eu/midnightdust/celestria/render/ShootingStarRenderer.java create mode 100644 common/src/main/java/eu/midnightdust/celestria/render/ShootingStarRendering.java diff --git a/build.gradle b/build.gradle index f9d9bba..2864ad8 100755 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.6-SNAPSHOT" apply false + id "dev.architectury.loom" version "1.10-SNAPSHOT" apply false id "me.shedaniel.unified-publishing" version "0.1.+" apply false id 'com.github.johnrengelman.shadow' version '8.1.1' apply false } diff --git a/common/src/main/java/eu/midnightdust/celestria/CelestriaClient.java b/common/src/main/java/eu/midnightdust/celestria/CelestriaClient.java index 3c94f23..ba0088c 100755 --- a/common/src/main/java/eu/midnightdust/celestria/CelestriaClient.java +++ b/common/src/main/java/eu/midnightdust/celestria/CelestriaClient.java @@ -33,7 +33,7 @@ public class CelestriaClient { shootingStars.forEach(ShootingStar::tick); shootingStars.removeAll(shootingStars.stream().filter(star -> star.progress <= 0).toList()); if (CelestriaClient.clientOnlyMode && CelestriaConfig.enableShootingStars && client.world != null) { - float tickDelta = client.getRenderTickCounter().getTickDelta(true); + float tickDelta = client.getRenderTickCounter().getDynamicDeltaTicks(); if ((180 < client.world.getSkyAngle(tickDelta) * 360 && 270 > client.world.getSkyAngle(tickDelta) * 360) && random.nextInt(Celestria.getChance(client.world)) == 0) { shootingStars.add(new ShootingStar(CelestriaConfig.shootingStarPathLength, random.nextInt(3), random.nextBetween(100, 150), random.nextInt(360), random.nextBetween(10, 170), random.nextBetween(Math.min(CelestriaConfig.shootingStarMinSize, CelestriaConfig.shootingStarMaxSize), Math.max(CelestriaConfig.shootingStarMaxSize, CelestriaConfig.shootingStarMinSize)))); } diff --git a/common/src/main/java/eu/midnightdust/celestria/ShootingStar.java b/common/src/main/java/eu/midnightdust/celestria/ShootingStar.java index 458fc72..bff4159 100644 --- a/common/src/main/java/eu/midnightdust/celestria/ShootingStar.java +++ b/common/src/main/java/eu/midnightdust/celestria/ShootingStar.java @@ -1,8 +1,14 @@ package eu.midnightdust.celestria; +import eu.midnightdust.celestria.config.CelestriaConfig; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; + +@Environment(EnvType.CLIENT) public class ShootingStar { public int progress; public final int type, x, y, rotation, size; + public int phaseScore; public ShootingStar(int progress, int type, int x, int y, int rotation, int size) { this.progress = progress; this.type = type; @@ -10,9 +16,25 @@ public class ShootingStar { this.y = y; this.rotation = rotation; this.size = size; + this.phaseScore = 0; } public void tick() { --progress; + phaseScore++; + phaseScore %= 100; + } + + /** + * Get the current phase of the shooting star (UV offset of the texture) + * @see ShootingStar#phaseScore + * @see CelestriaConfig#shootingStarPhaseCycle + * @return [0, 25%) -> 0.0F, [25%, 50%) -> 0.25F, [50%, 75%) -> 0.5F, [75%, 100%) -> 0.75F + */ + public float getPhase() { + if ((double) this.phaseScore / CelestriaConfig.shootingStarPhaseCycle < 0.25) return 0.0F; + else if ((double) this.phaseScore / CelestriaConfig.shootingStarPhaseCycle < 0.5) return 0.25F; + else if ((double) this.phaseScore / CelestriaConfig.shootingStarPhaseCycle < 0.75) return 0.5F; + else return 0.75F; } } diff --git a/common/src/main/java/eu/midnightdust/celestria/config/CelestriaConfig.java b/common/src/main/java/eu/midnightdust/celestria/config/CelestriaConfig.java index e2e3036..8d1fb61 100755 --- a/common/src/main/java/eu/midnightdust/celestria/config/CelestriaConfig.java +++ b/common/src/main/java/eu/midnightdust/celestria/config/CelestriaConfig.java @@ -17,6 +17,7 @@ public class CelestriaConfig extends MidnightConfig { @Entry(category = STARS, isSlider = true, min = 0, max = 500) public static int shootingStarPathLength = 50; @Entry(category = STARS) public static int shootingStarChance = 20000; @Entry(category = STARS) public static int shootingStarLuckDuration = 1000; + @Entry(category = STARS, min = 4) public static int shootingStarPhaseCycle = 60; @Entry(category = STARS) public static List shootingStarMessages = Lists.newArrayList("celestria.shootingStar.1", "celestria.shootingStar.2", "celestria.shootingStar.3"); @Entry(category = INSOMNIA) public static boolean enableInsomnia = true; @Entry(category = INSOMNIA) public static int insomniaChance = 30000; diff --git a/common/src/main/java/eu/midnightdust/celestria/mixin/MixinSkyRendering.java b/common/src/main/java/eu/midnightdust/celestria/mixin/MixinSkyRendering.java new file mode 100644 index 0000000..c8a2b61 --- /dev/null +++ b/common/src/main/java/eu/midnightdust/celestria/mixin/MixinSkyRendering.java @@ -0,0 +1,21 @@ +package eu.midnightdust.celestria.mixin; + +import eu.midnightdust.celestria.render.ShootingStarRendering; +import net.minecraft.client.render.SkyRendering; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.util.math.MatrixStack; +import org.spongepowered.asm.mixin.Mixin; +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.CallbackInfo; + +@Mixin(SkyRendering.class) +public abstract class MixinSkyRendering { + @Unique private final ShootingStarRendering celestria$shootingStarRendering = new ShootingStarRendering(); + + @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;draw()V"), method = "renderCelestialBodies") + private void celestria$renderShootingStars(MatrixStack matrices, VertexConsumerProvider.Immediate vertexConsumers, float rot, int phase, float alpha, float starBrightness, CallbackInfo ci) { + celestria$shootingStarRendering.renderShootingStars(matrices, vertexConsumers); + } +} diff --git a/common/src/main/java/eu/midnightdust/celestria/mixin/MixinWorldRenderer.java b/common/src/main/java/eu/midnightdust/celestria/mixin/MixinWorldRenderer.java deleted file mode 100644 index a38e1f4..0000000 --- a/common/src/main/java/eu/midnightdust/celestria/mixin/MixinWorldRenderer.java +++ /dev/null @@ -1,28 +0,0 @@ -package eu.midnightdust.celestria.mixin; - -import eu.midnightdust.celestria.render.ShootingStarRenderer; -import net.minecraft.client.render.Camera; -import net.minecraft.client.render.WorldRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.client.world.ClientWorld; -import org.jetbrains.annotations.Nullable; -import org.joml.Matrix4f; -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.CallbackInfo; - -@Mixin(WorldRenderer.class) -public abstract class MixinWorldRenderer { - @Unique private final ShootingStarRenderer celestria$shootingStarRenderer = new ShootingStarRenderer(); - @Shadow @Nullable private ClientWorld world; - - @Inject(at = @At(value = "TAIL"), method = "renderSky(Lorg/joml/Matrix4f;Lorg/joml/Matrix4f;FLnet/minecraft/client/render/Camera;ZLjava/lang/Runnable;)V") - public void celestria$renderShootingStars(Matrix4f matrix4f, Matrix4f projectionMatrix, float tickDelta, Camera camera, boolean thickFog, Runnable fogCallback, CallbackInfo ci) { - MatrixStack matrices = new MatrixStack(); - matrices.multiplyPositionMatrix(matrix4f); - celestria$shootingStarRenderer.renderShootingStars(world, matrices); - } -} diff --git a/common/src/main/java/eu/midnightdust/celestria/render/ShootingStarRenderer.java b/common/src/main/java/eu/midnightdust/celestria/render/ShootingStarRenderer.java deleted file mode 100644 index 5e0eced..0000000 --- a/common/src/main/java/eu/midnightdust/celestria/render/ShootingStarRenderer.java +++ /dev/null @@ -1,62 +0,0 @@ -package eu.midnightdust.celestria.render; - -import com.mojang.blaze3d.systems.RenderSystem; -import eu.midnightdust.celestria.CelestriaClient; -import eu.midnightdust.celestria.ShootingStar; -import eu.midnightdust.celestria.config.CelestriaConfig; -import net.minecraft.client.render.BufferBuilder; -import net.minecraft.client.render.BufferRenderer; -import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.render.Tessellator; -import net.minecraft.client.render.VertexFormat; -import net.minecraft.client.render.VertexFormats; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.util.math.RotationAxis; -import org.joml.Matrix4f; - -import static eu.midnightdust.celestria.Celestria.id; -import static java.lang.Math.pow; - -public class ShootingStarRenderer { - public void renderShootingStars(ClientWorld world, MatrixStack matrices) { - if (world != null && CelestriaConfig.enableShootingStars && !CelestriaClient.shootingStars.isEmpty()) { - world.getProfiler().swap("shooting_stars"); - RenderSystem.defaultBlendFunc(); - RenderSystem.enableDepthTest(); - RenderSystem.enableBlend(); - RenderSystem.setShader(GameRenderer::getPositionTexColorProgram); - CelestriaClient.shootingStars.forEach(star -> renderShootingStar(world, matrices, star)); - RenderSystem.disableBlend(); - RenderSystem.disableDepthTest(); - } - } - @SuppressWarnings("SuspiciousNameCombination") - private void renderShootingStar(ClientWorld world, MatrixStack matrices, ShootingStar star) { - if (world != null && CelestriaConfig.enableShootingStars && !CelestriaClient.shootingStars.isEmpty()) { - world.getProfiler().swap("shooting_stars"); - float alpha = (float) Math.clamp((star.progress - pow(1f / star.progress, 4)) / CelestriaConfig.shootingStarPathLength, 0, 1); - matrices.push(); - matrices.scale(CelestriaConfig.shootingStarDistance,CelestriaConfig.shootingStarDistance,CelestriaConfig.shootingStarDistance); - int direction = isEven(star.type) ? -1 : 1; - matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(star.y)); - matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(star.rotation * direction)); - matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(star.x+(star.progress*CelestriaConfig.shootingStarSpeed*0.05f))); - matrices.translate(star.progress * CelestriaConfig.shootingStarSpeed * direction, 0, 0); - Matrix4f matrix4f = matrices.peek().getPositionMatrix(); - RenderSystem.setShaderTexture(0, id("textures/environment/shooting_star"+(star.type+1)+".png")); - BufferBuilder bufferBuilder = Tessellator.getInstance().begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_TEXTURE_COLOR); - float height = star.size / 100f * 20.0F; - float width = star.size / 100f * 100.0F; - bufferBuilder.vertex(matrix4f, -height, -width, height).texture(0.0F, 0.0F).color(1, 1, 1, alpha); - bufferBuilder.vertex(matrix4f, height, -width, height).texture(1.0F, 0.0F).color(1, 1, 1, alpha); - bufferBuilder.vertex(matrix4f, height, -width, -height).texture(1.0F, 1.0F).color(1, 1, 1, alpha); - bufferBuilder.vertex(matrix4f, -height, -width, -height).texture(0.0F, 1.0F).color(1, 1, 1, alpha); - BufferRenderer.drawWithGlobalProgram(bufferBuilder.end()); - matrices.pop(); - } - } - public static boolean isEven(int i) { - return (i | 1) > i; - } -} diff --git a/common/src/main/java/eu/midnightdust/celestria/render/ShootingStarRendering.java b/common/src/main/java/eu/midnightdust/celestria/render/ShootingStarRendering.java new file mode 100644 index 0000000..43f31ea --- /dev/null +++ b/common/src/main/java/eu/midnightdust/celestria/render/ShootingStarRendering.java @@ -0,0 +1,50 @@ +package eu.midnightdust.celestria.render; + +import eu.midnightdust.celestria.CelestriaClient; +import eu.midnightdust.celestria.ShootingStar; +import eu.midnightdust.celestria.config.CelestriaConfig; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.*; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.math.RotationAxis; +import net.minecraft.util.profiler.Profilers; +import org.joml.Matrix4f; + +import static eu.midnightdust.celestria.Celestria.id; +import static java.lang.Math.pow; + +public class ShootingStarRendering { + public void renderShootingStars(MatrixStack matrices, VertexConsumerProvider.Immediate vertexConsumers) { + if (MinecraftClient.getInstance().world == null) return; + Profilers.get().swap("shooting_stars"); + CelestriaClient.shootingStars.forEach(star -> renderShootingStar(matrices, vertexConsumers, star)); + } + + @SuppressWarnings("SuspiciousNameCombination") + private void renderShootingStar(MatrixStack matrices, VertexConsumerProvider.Immediate vertexConsumers, ShootingStar star) { + if (MinecraftClient.getInstance().world != null && CelestriaConfig.enableShootingStars && !CelestriaClient.shootingStars.isEmpty()) { + matrices.push(); + float alpha = (float) Math.clamp((star.progress - pow(1f / star.progress, 4)) / CelestriaConfig.shootingStarPathLength, 0, 1); + matrices.scale(CelestriaConfig.shootingStarDistance, CelestriaConfig.shootingStarDistance, CelestriaConfig.shootingStarDistance); + int direction = isEven(star.type) ? -1 : 1; + matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(-star.y)); + matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(-star.rotation * direction)); + matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(-star.x - (star.progress * CelestriaConfig.shootingStarSpeed * 0.05f))); + matrices.translate(star.progress * CelestriaConfig.shootingStarSpeed * direction, 0, 0); + Matrix4f posMat4f = matrices.peek().getPositionMatrix(); + // draw the star + float height = star.size / 100f * 20.0F; + float width = star.size / 100f * 100.0F; + VertexConsumer vertexconsumer = vertexConsumers.getBuffer(RenderLayer.getCelestial(id("textures/environment/shooting_star" + (star.type + 1) + ".png"))); + vertexconsumer.vertex(posMat4f, -height, -width, height).texture(0.0F, star.getPhase()).color(1.0F, 1.0F, 1.0F, alpha); + vertexconsumer.vertex(posMat4f, height, -width, height).texture(1.0F, star.getPhase()).color(1.0F, 1.0F, 1.0F, alpha); + vertexconsumer.vertex(posMat4f, height, -width, -height).texture(1.0F, star.getPhase() + 0.25F).color(1.0F, 1.0F, 1.0F, alpha); + vertexconsumer.vertex(posMat4f, -height, -width, -height).texture(0.0F, star.getPhase() + 0.25F).color(1.0F, 1.0F, 1.0F, alpha); + matrices.pop(); + } + } + + public static boolean isEven(int i) { + return (i | 1) > i; + } +} diff --git a/common/src/main/resources/assets/celestria/lang/en_us.json b/common/src/main/resources/assets/celestria/lang/en_us.json index fd1ee43..9d85224 100755 --- a/common/src/main/resources/assets/celestria/lang/en_us.json +++ b/common/src/main/resources/assets/celestria/lang/en_us.json @@ -13,6 +13,7 @@ "celestria.midnightconfig.shootingStarChance": "Chance", "celestria.midnightconfig.shootingStarLuckDuration": "Luck Duration", "celestria.midnightconfig.shootingStarMessages": "Messages", + "celestria.midnightconfig.shootingStarPhaseCycle": "Phase Cycle Duration (in ticks)", "celestria.midnightconfig.enableInsomnia": "Enable Insomnia", "celestria.midnightconfig.insomniaChance": "Chance", "celestria.midnightconfig.insomniaMessages": "Messages", diff --git a/common/src/main/resources/assets/celestria/lang/ru_ru.json b/common/src/main/resources/assets/celestria/lang/ru_ru.json index b02c279..34dc077 100644 --- a/common/src/main/resources/assets/celestria/lang/ru_ru.json +++ b/common/src/main/resources/assets/celestria/lang/ru_ru.json @@ -1,19 +1,27 @@ { - "celestria.midnightconfig.title": "Настройки Celestria", - "celestria.midnightconfig.sendChatMessages": "Отправлять Сообщения в Чате о Событиях", - "celestria.midnightconfig.enableShootingStars": "Включить Падающие Звёзды", - "celestria.midnightconfig.shootingStarChance": "Шанс Падающей Звезды", - "celestria.midnightconfig.shootingStarCooldownLength": "Длительность Отката Падающей Звезды", - "celestria.midnightconfig.shootingStarLuckDuration": "Длительность Эффекта Удачи от Падающей Звезды", - "celestria.midnightconfig.shootingStarMessages": "Сообщение о Падающей Звезде", + "celestria.insomnia.1": "§cТы боишься полнолуния, поэтому не можешь найти себе покоя...", + "celestria.insomnia.2": "§3Ауууууууу... Ты слышишь странные звуки издалека и не можешь закрыть глаза", + "celestria.midnightconfig.category.insomnia": "Insomnia", + "celestria.midnightconfig.category.stars": "Падающие звезды", "celestria.midnightconfig.enableInsomnia": "Включить Бессонницу", + "celestria.midnightconfig.enableShootingStars": "Включить Падающие Звёзды", "celestria.midnightconfig.insomniaChance": "Шанс Бессонницы", - "celestria.midnightconfig.insomniaMessages": "Сообщение при Бессоннице", "celestria.midnightconfig.insomniaDuration": "Длительность Эффекта Бессонницы", + "celestria.midnightconfig.insomniaMessages": "Сообщение при Бессоннице", + "celestria.midnightconfig.sendChatMessages": "Отправлять Сообщения в Чате о Событиях", + "celestria.midnightconfig.shootingStarChance": "Шанс Падающей Звезды", + "celestria.midnightconfig.shootingStarDistance": "Расстояние", + "celestria.midnightconfig.shootingStarDistance.tooltip": "Регулировка расстояния может улучшить поддержку шейдеров", + "celestria.midnightconfig.shootingStarLuckDuration": "Длительность Эффекта Удачи от Падающей Звезды", + "celestria.midnightconfig.shootingStarMaxSize": "Max Size", + "celestria.midnightconfig.shootingStarMessages": "Сообщение о Падающей Звезде", + "celestria.midnightconfig.shootingStarMinSize": "Min Size", + "celestria.midnightconfig.shootingStarPathLength": "Path Length", + "celestria.midnightconfig.shootingStarPhaseCycle": "Phase Cycle Duration (in ticks)", + "celestria.midnightconfig.shootingStarSpeed": "Скорость", + "celestria.midnightconfig.title": "Настройки Celestria", "celestria.shootingStar.1": "§eО, гляди! Появилась падающая звезда и благословила тебя удачей!", "celestria.shootingStar.2": "§6Вау, появилась падающая звезда, загадай желание!", "celestria.shootingStar.3": "§2♪ Можем ли мы представить, что самолеты в ночном небе походят на падающие звезды...... ♫", - "celestria.insomnia.1": "§cТы боишься полнолуния, поэтому не можешь найти себе покоя...", - "celestria.insomnia.2": "§3Ауууууууу... Ты слышишь странные звуки издалека и не можешь закрыть глаза", "effect.celestria.insomnia": "Бессонница" -} +} \ No newline at end of file diff --git a/common/src/main/resources/assets/celestria/textures/environment/shooting_star1.png b/common/src/main/resources/assets/celestria/textures/environment/shooting_star1.png index b0d3396d43b463bb50148a14dc8a18d52526afac..01e7ab53177d834879653dfa5a4bcbf3d4434e65 100644 GIT binary patch delta 1176 zcma)5O=uHA6i%>Bnkq&V?4eet14@cbb~itpWVNkn5^ccfT7%X<>}Ge8EGD~gcWtW( z5v_R8gEFEAPlAf|Ai@8G2c;K1RXqs`Ui>Sfcqk~P5NDgT#TJVL!|Z$W?R($*-kTBE zFXzRkO{W@`SS*%9Pp-Mhv5eoIij%Wasf>@0e+@R+R~S8N+_pS{fqh6;H_=ZZPiQ1zUO1$&co#wb#Z zho&GNw)fyMd-HlWET)-sChZPNEOL8Uzuz4W28hY}LSZQ&vS~I5@ydptT|g4Kt*TZK zj1DLlge;l%tG(BM3Uzse4+z-Jv0Q@dSykOV_m3|yKHJS!X*Rr9Jwa+pLQnDZy1QC?Fsa-Ll1z1zA$A|7R# zFiUuP7}yCm6K=^Q*CXqOsvRe`CS|zY=xFULF9Y3(4;Y*v8q*r+!T^#W&{s@*#hjpI zk<LNVg{#uk)r>JHXeg3J z3K@m!B=fadD*`W>FW}lME0Q{>i*2Ni`DIX~aB5BiYQ8*k%EnajSb=1TC?Yb&(`%A- z3)xxmI`LJz-&YNomuEs(5!7O#aO=`lr5cmo*jDq;A&zhPn@4>xd&UL6Qh#KYEM3&TQ&O1IehYCrC5$T w-hG%lwFO*S$2nd*ho63`fU(Kz)Ej3BElG`7ua#dM;0X;&BEBPbx4ZxJAB6mV!~g&Q literal 5161 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 J`+Qd9{}&ni5M=-W diff --git a/common/src/main/resources/celestria.mixins.json b/common/src/main/resources/celestria.mixins.json index b6e3fcb..cca6cab 100755 --- a/common/src/main/resources/celestria.mixins.json +++ b/common/src/main/resources/celestria.mixins.json @@ -3,7 +3,7 @@ "package": "eu.midnightdust.celestria.mixin", "compatibilityLevel": "JAVA_17", "client": [ - "MixinWorldRenderer" + "MixinSkyRendering" ], "mixins": [ "MixinBedBlock" diff --git a/gradle.properties b/gradle.properties index d99506b..1e89a7a 100755 --- a/gradle.properties +++ b/gradle.properties @@ -2,27 +2,24 @@ org.gradle.parallel=true org.gradle.jvmargs=-Xmx2048M -minecraft_version=1.21 -supported_versions=1.21.1 -yarn_mappings=1.21+build.2 +minecraft_version=1.21.6 +supported_versions=1.21.6 +yarn_mappings=1.21.6+build.1 enabled_platforms=fabric,neoforge archives_base_name=celestria -mod_version=2.0.0 +mod_version=2.0.1-rc.1 maven_group=eu.midnightdust release_type=release curseforge_id=1085811 modrinth_id=GoCfVRkX # Configure the IDs here after creating the projects on the websites -midnightlib_version=1.5.8 +midnightlib_version=1.7.5+1.21.6 -fabric_loader_version=0.15.11 -fabric_api_version=0.100.1+1.21 -polymer_version=0.9.6+1.21 +fabric_loader_version=0.16.14 +fabric_api_version=0.127.1+1.21.6 +polymer_version=0.13.1+1.21.6 -neoforge_version=21.0.143 -yarn_mappings_patch_neoforge_version = 1.21+build.4 - -quilt_loader_version=0.19.0-beta.18 -quilt_fabric_api_version=7.0.1+0.83.0-1.20 +neoforge_version=21.6.11-beta +yarn_mappings_patch_neoforge_version=1.21+build.4 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 19cfad9..96d8316 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https://mirrors.aliyun.com/gradle/distributions/v8.13.0/gradle-8.13-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index 9f794f4..126275f 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -19,14 +19,14 @@ config = "celestria.mixins.json" [[dependencies.celestria]] modId = "neoforge" mandatory = true -versionRange = "[21.0,)" +versionRange = "[21.6,)" ordering = "NONE" side = "BOTH" [[dependencies.celestria]] modId = "minecraft" mandatory = true -versionRange = "[1.21,)" +versionRange = "[1.21.6,)" ordering = "NONE" side = "BOTH"