From ef18e0ae325edceec5df800a7f3e513e3f1d7477 Mon Sep 17 00:00:00 2001 From: koka Date: Sun, 30 Aug 2026 01:19:02 +0200 Subject: [PATCH] Fix white disc audio cadence and release alpha.216 --- CHANGELOG.md | 11 + README.md | 4 +- ambiance/build.gradle | 20 +- .../client/audio/LavaplayerAudioStream.java | 14 +- .../client/audio/WhiteDiscAudioPlayer.java | 1 + .../audio/LavaplayerAudioStreamSmoke.java | 80 +++++ .../client/audio/WhiteDiscPlaybackSmoke.java | 14 +- build.gradle | 315 ++++++++++++------ gradle.properties | 4 +- ...white-disc-audio-quality-to-alpha.216.json | 43 +++ pack/packwiz/index.toml | 22 +- pack/packwiz/pack.toml | 4 +- pack/prism/modrinth.index.json | 2 +- pack/release.json | 4 +- 14 files changed, 396 insertions(+), 142 deletions(-) create mode 100644 ambiance/src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/LavaplayerAudioStreamSmoke.java create mode 100644 pack/migrations/26.2.0-alpha.215-white-disc-audio-quality-to-alpha.216.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bbc91d..e99661d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,17 @@ Ce journal suit les **versions du modpack**. Lorsqu'un seul module change, sa ve - Depuis `26.2.0-alpha.6`, le pack et les modules ont des versions indépendantes. I Like To Move It et Only Fun deviennent les cinquième et sixième modules actifs dans l'alpha 46. - Les versions ci-dessous ont été reconstituées à partir des JAR archivés, des packs locaux et du code source actuel. Les dates n'étant pas enregistrées de manière fiable, elles ne sont pas inventées. +## `26.2.0-alpha.216` + +Module modifié : **Ambiance `0.0.0-alpha.19`**. Les neuf autres modules conservent leur version issue de l'alpha.215. + +- corrige le disque blanc ralenti et dégradé en remplissant continûment les tampons PCM d’une seconde demandés par Minecraft au lieu de les compléter prématurément avec du silence ; +- conserve une fréquence réelle de 48 kHz, un flux mono 16 bits little-endian et force la vitesse OpenAL normale à `1.0` ; +- borne chaque attente de trame à 250 ms après le démarrage afin de garder un flux continu sans bloquer indéfiniment le thread audio ; +- ajoute un test déterministe des tampons Minecraft et renforce le test YouTube réel sur quatre secondes complètes ; +- conserve les données Ambiance v2, le protocole réseau 6, les IDs et les sauvegardes existantes ; +- distribue Ambiance `0.0.0-alpha.19` dans Packwiz et le `.mrpack` partagé client/serveur, sans exiger de nouveau monde ni réinitialiser les sauvegardes. + ## `26.2.0-alpha.215` Module modifié : **Ambiance `0.0.0-alpha.18`**. Les neuf autres modules conservent leur version issue de l'alpha.214. diff --git a/README.md b/README.md index cdeb178..daaf4b5 100644 --- a/README.md +++ b/README.md @@ -22,11 +22,11 @@ Licence : **GNU GPL 3.0 or Later** (`GPL-3.0-or-later`) Les descriptions FR/EN/RU sont déclarées dans chaque `fabric.mod.json` et dans les fichiers de langue. Les images fournies servent d'icônes Fabric de leur module. -Version courante du pack distribué : **`26.2.0-alpha.215`**. Cette release corrective distribue Ambiance **`0.0.0-alpha.18`** ; les neuf autres modules conservent leur version issue de l'alpha.214. +Version courante du pack distribué : **`26.2.0-alpha.216`**. Cette release corrective distribue Ambiance **`0.0.0-alpha.19`** ; les neuf autres modules conservent leur version issue de l'alpha.215. La migration [CANA-01 à CANA-09](CANAPLIA.md) porte Canaplia vers Minecraft 26.2. It's Alive **`0.0.0-alpha.35`** enregistre les seize familles, les découvertes, hybridations, résines, effets serveur et le Livre interdit personnel, partageable temporairement sur un pupitre. Ambiance **`0.0.0-alpha.14`** compose les profils visuels bornés avec ses réglages d'accessibilité, et Only Fun **`0.0.0-alpha.21`** exclut explicitement Canaplia et les raccourcis de progression du Shop. -L’alpha.215 stabilise le disque blanc : le décodage YouTube utilise la source corrigée, les arrêts et erreurs restent sur les threads audio appropriés et ne font plus tomber le client. Les packs Modrinth, Prism et Packwiz sont mis à jour sans exiger de nouveau monde ni réinitialiser les sauvegardes. +L’alpha.216 corrige la lecture lente et dégradée du disque blanc : les quatre tampons PCM initiaux de Minecraft sont maintenant remplis continûment à 48 kHz, avec une vitesse OpenAL normale, au lieu d’être majoritairement complétés par du silence. Les packs Modrinth, Prism et Packwiz sont mis à jour sans exiger de nouveau monde ni réinitialiser les sauvegardes. L’alpha.207 rend le stockage du coffre-fort pratiquement illimité : rubis, saphirs et émeraudes utilisent chacun un solde 64 bits. Les 27 anciennes piles sont additionnées automatiquement lors du chargement, le Shop continue de consommer directement ces soldes et les 20 % pillés sont crédités dans le coffre-fort de l’attaquant sans créer des millions d’entités ou de piles d’objets. diff --git a/ambiance/build.gradle b/ambiance/build.gradle index 8c659be..c6ef258 100644 --- a/ambiance/build.gradle +++ b/ambiance/build.gradle @@ -74,16 +74,25 @@ tasks.register("whiteDiscPlaybackSmoke", JavaExec) { mainClass = "fr.koka99cab.sanctuary26.ambiance.client.audio.WhiteDiscPlaybackSmoke" } +tasks.register("whiteDiscStreamSmoke", JavaExec) { + group = "verification" + description = "Checks continuous 48 kHz PCM buffering for Minecraft's white-disc channel." + dependsOn tasks.named("testClasses") + classpath = sourceSets.test.runtimeClasspath + mainClass = "fr.koka99cab.sanctuary26.ambiance.client.audio.LavaplayerAudioStreamSmoke" +} + tasks.named("test") { failOnNoDiscoveredTests = false } tasks.register("verifyAmbiance") { group = "verification" - description = "Checks Ambiance alpha.18, including resilient white-disc YouTube playback." + description = "Checks Ambiance alpha.19, including continuous white-disc PCM playback." inputs.files(fileTree("src/main/java")) inputs.files(fileTree("src/main/resources")) inputs.file(file("src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscPlaybackSmoke.java")) + inputs.file(file("src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/LavaplayerAudioStreamSmoke.java")) inputs.file(rootProject.file("pack/migrations/26.2.0-alpha.125-realtime-calendar-to-alpha.126.json")) inputs.file(rootProject.file("pack/migrations/26.2.0-alpha.127-daily-ambiance-sodium-iris-to-alpha.128.json")) inputs.file(rootProject.file("pack/migrations/26.2.0-alpha.128-ambiance-visuals-canon-iris-to-alpha.129.json")) @@ -138,7 +147,7 @@ tasks.register("verifyAmbiance") { def whiteDiscPlaybackSmoke = file( "src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscPlaybackSmoke.java").text - if (project.version.toString() != "0.0.0-alpha.18" + if (project.version.toString() != "0.0.0-alpha.19" || migration.source?.pack_version != "26.2.0-alpha.125" || migration.target?.pack_version != "26.2.0-alpha.126" || migration.target?.modules?.ambiance != "0.0.0-alpha.1" @@ -346,7 +355,9 @@ tasks.register("verifyAmbiance") { || !javaText.contains('player.addListener(new AudioEventAdapter()') || !javaText.contains('failPlayback(client, key, failedPlayer)') || !javaText.contains('initialWaitAttempted') - || !javaText.contains('frame = player.provide()') + || !javaText.contains('CONTINUATION_FRAME_WAIT_MILLIS = 250L') + || !javaText.contains('player.provide(waitMillis, TimeUnit.MILLISECONDS)') + || !whiteDiscAudioPlayer.contains('channel.setPitch(1.0F)') || !whiteDiscAudioPlayer.contains('handle.execute(channel -> channel.stop())') || whiteDiscAudioPlayer.contains('.release()') || !whiteDiscPlaybackSmoke.contains('https://www.youtube.com/watch?v=Ue5ZBe-GzSM') @@ -375,7 +386,7 @@ tasks.register("verifyAmbiance") { || !file("build.gradle").text.contains( 'def youtubeSourceVersion = "f45bbb7aebfcbc1c553769e04af6cd43afa8b7c3-SNAPSHOT"') || !file("build.gradle").text.contains('dev.lavalink.youtube:v2:${youtubeSourceVersion}')) { - throw new GradleException("Ambiance alpha.18 white-disc playback contract is incomplete") + throw new GradleException("Ambiance white-disc playback contract is incomplete") } [ @@ -429,4 +440,5 @@ tasks.named("check") { dependsOn tasks.named("ambianceScheduleSmoke") dependsOn tasks.named("ambianceVisualApiSmoke") dependsOn tasks.named("whiteDiscUrlSmoke") + dependsOn tasks.named("whiteDiscStreamSmoke") } diff --git a/ambiance/src/main/java/fr/koka99cab/sanctuary26/ambiance/client/audio/LavaplayerAudioStream.java b/ambiance/src/main/java/fr/koka99cab/sanctuary26/ambiance/client/audio/LavaplayerAudioStream.java index e314bd7..33e6865 100644 --- a/ambiance/src/main/java/fr/koka99cab/sanctuary26/ambiance/client/audio/LavaplayerAudioStream.java +++ b/ambiance/src/main/java/fr/koka99cab/sanctuary26/ambiance/client/audio/LavaplayerAudioStream.java @@ -12,6 +12,8 @@ import net.minecraft.client.sounds.AudioStream; /** Adapts bounded mono PCM frames from Lavaplayer to Minecraft's streaming OpenAL channel. */ final class LavaplayerAudioStream implements AudioStream { static final int SAMPLE_RATE = 48_000; + private static final long INITIAL_FRAME_WAIT_MILLIS = 2_000L; + private static final long CONTINUATION_FRAME_WAIT_MILLIS = 250L; private static final AudioFormat FORMAT = new AudioFormat(SAMPLE_RATE, 16, 1, true, false); private final AudioPlayer player; @@ -61,13 +63,11 @@ final class LavaplayerAudioStream implements AudioStream { private AudioFrame nextFrame() throws IOException { try { - AudioFrame frame; - if (!initialWaitAttempted) { - initialWaitAttempted = true; - frame = player.provide(2, TimeUnit.SECONDS); - } else { - frame = player.provide(); - } + long waitMillis = initialWaitAttempted + ? CONTINUATION_FRAME_WAIT_MILLIS + : INITIAL_FRAME_WAIT_MILLIS; + initialWaitAttempted = true; + AudioFrame frame = player.provide(waitMillis, TimeUnit.MILLISECONDS); if (frame == null && player.getPlayingTrack() == null) ended = true; return frame; } catch (TimeoutException ignored) { diff --git a/ambiance/src/main/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscAudioPlayer.java b/ambiance/src/main/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscAudioPlayer.java index 632a368..19f265e 100644 --- a/ambiance/src/main/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscAudioPlayer.java +++ b/ambiance/src/main/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscAudioPlayer.java @@ -150,6 +150,7 @@ public final class WhiteDiscAudioPlayer { try { channel.setSelfPosition(Vec3.atCenterOf(pos)); channel.setRelative(false); + channel.setPitch(1.0F); channel.linearAttenuation(ATTENUATION_DISTANCE); channel.setVolume(volume); channel.attachBufferStream(stream); diff --git a/ambiance/src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/LavaplayerAudioStreamSmoke.java b/ambiance/src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/LavaplayerAudioStreamSmoke.java new file mode 100644 index 0000000..bc01f44 --- /dev/null +++ b/ambiance/src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/LavaplayerAudioStreamSmoke.java @@ -0,0 +1,80 @@ +package fr.koka99cab.sanctuary26.ambiance.client.audio; + +import com.sedmelluq.discord.lavaplayer.format.Pcm16AudioDataFormat; +import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; +import com.sedmelluq.discord.lavaplayer.track.playback.AudioFrame; +import com.sedmelluq.discord.lavaplayer.track.playback.ImmutableAudioFrame; +import java.lang.reflect.Proxy; +import java.nio.ByteBuffer; +import java.util.ArrayDeque; +import java.util.Arrays; +import java.util.Queue; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +/** Deterministic check for Minecraft's four one-second streaming buffers. */ +public final class LavaplayerAudioStreamSmoke { + private static final int FRAME_SAMPLES = 960; + private static final int FRAME_BYTES = FRAME_SAMPLES * 2; + private static final int FRAMES_PER_SECOND = LavaplayerAudioStream.SAMPLE_RATE / FRAME_SAMPLES; + + private LavaplayerAudioStreamSmoke() { + } + + public static void main(String[] args) throws Exception { + Queue frames = new ArrayDeque<>(); + Pcm16AudioDataFormat format = new Pcm16AudioDataFormat( + 1, LavaplayerAudioStream.SAMPLE_RATE, FRAME_SAMPLES, false); + for (int index = 0; index < FRAMES_PER_SECOND; index++) { + byte[] data = new byte[FRAME_BYTES]; + Arrays.fill(data, (byte) (index + 1)); + frames.add(new ImmutableAudioFrame(index * 20L, data, 100, format)); + } + + AtomicInteger timedProvides = new AtomicInteger(); + AtomicInteger nonBlockingProvides = new AtomicInteger(); + AtomicBoolean destroyed = new AtomicBoolean(); + AudioPlayer player = (AudioPlayer) Proxy.newProxyInstance( + AudioPlayer.class.getClassLoader(), new Class[] {AudioPlayer.class}, + (proxy, method, arguments) -> switch (method.getName()) { + case "provide" -> { + if (method.getParameterCount() == 2) { + timedProvides.incrementAndGet(); + yield frames.poll(); + } + nonBlockingProvides.incrementAndGet(); + yield null; + } + case "destroy" -> { + destroyed.set(true); + yield null; + } + case "getPlayingTrack" -> null; + case "getVolume" -> 100; + case "isPaused", "startTrack" -> false; + default -> null; + }); + + LavaplayerAudioStream stream = new LavaplayerAudioStream(player); + ByteBuffer pcm = stream.read(LavaplayerAudioStream.SAMPLE_RATE * 2); + if (pcm == null || pcm.remaining() != LavaplayerAudioStream.SAMPLE_RATE * 2) { + throw new IllegalStateException("The stream did not fill Minecraft's one-second buffer"); + } + while (pcm.hasRemaining()) { + if (pcm.get() == 0) { + throw new IllegalStateException("The stream padded available PCM with silence"); + } + } + if (timedProvides.get() != FRAMES_PER_SECOND || nonBlockingProvides.get() != 0) { + throw new IllegalStateException("PCM frames were not read with bounded waits"); + } + if (stream.getFormat().getSampleRate() != LavaplayerAudioStream.SAMPLE_RATE + || stream.getFormat().isBigEndian()) { + throw new IllegalStateException("The OpenAL PCM format is not 48 kHz little-endian"); + } + stream.close(); + if (!destroyed.get()) { + throw new IllegalStateException("Closing the stream did not destroy its player"); + } + } +} diff --git a/ambiance/src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscPlaybackSmoke.java b/ambiance/src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscPlaybackSmoke.java index 3650393..b7ae0f8 100644 --- a/ambiance/src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscPlaybackSmoke.java +++ b/ambiance/src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscPlaybackSmoke.java @@ -31,18 +31,28 @@ public final class WhiteDiscPlaybackSmoke { player.playTrack(track); LavaplayerAudioStream stream = new LavaplayerAudioStream(player); int decodedBytes = 0; + int totalBytes = 0; for (int index = 0; index < 4; index++) { ByteBuffer pcm = stream.read(LavaplayerAudioStream.SAMPLE_RATE * 2); if (pcm == null) break; while (pcm.hasRemaining()) { + totalBytes++; if (pcm.get() != 0) decodedBytes++; } } if (decodedBytes == 0) { throw new IllegalStateException("YouTube playback produced no audible PCM data"); } - System.out.println("Decoded audible PCM data from " - + track.getInfo().title); + double audibleRatio = (double) decodedBytes / totalBytes; + if (totalBytes != LavaplayerAudioStream.SAMPLE_RATE * 2 * 4) { + throw new IllegalStateException("YouTube playback did not fill four PCM seconds"); + } + if (audibleRatio < 0.75) { + throw new IllegalStateException("YouTube PCM stream was mostly silence: " + + Math.round(audibleRatio * 100.0) + "% audible bytes"); + } + System.out.printf("Decoded audible PCM data: %.1f%% at %.0f Hz from %s%n", + audibleRatio * 100.0, stream.getFormat().getSampleRate(), track.getInfo().title); stream.close(); } finally { manager.shutdown(); diff --git a/build.gradle b/build.gradle index 3efb190..78d016e 100644 --- a/build.gradle +++ b/build.gradle @@ -3437,7 +3437,7 @@ tasks.register("verifyProgressivePauseMenuRelease") { [(locale): new JsonSlurper().parse(file( "sanctuary/src/main/resources/assets/sanctuary/lang/${locale}.json"))] } - if (rootProject.pack_version != "26.2.0-alpha.215" + if (rootProject.pack_version != "26.2.0-alpha.216" || rootProject.sanctuary_version != "0.0.0-alpha.120" || rootProject.onlyfun_version != "0.0.0-alpha.24" || release.pack_version != rootProject.pack_version || index.versionId != rootProject.pack_version @@ -3487,7 +3487,7 @@ tasks.register("verifyMirrorLavenderDrawerRelease") { def redStonerRegistry = file( "redstoner/src/main/java/fr/koka99cab/sanctuary26/redstoner/registry/RedStonerRegistries.java").text def drawerRecipe = file("redstoner/src/main/resources/data/redstoner/recipe/drawer.json") - if (rootProject.pack_version != "26.2.0-alpha.215" + if (rootProject.pack_version != "26.2.0-alpha.216" || rootProject.anotherworld_version != "0.0.0-alpha.55" || rootProject.redstoner_version != "0.0.0-alpha.10" || release.pack_version != rootProject.pack_version || index.versionId != rootProject.pack_version @@ -4206,7 +4206,7 @@ tasks.register("verifyShopPricingLayoutRelease") { "pack/migrations/26.2.0-alpha.192-shop-pricing-layout-to-alpha.193.json")) def release = new JsonSlurper().parse(file("pack/release.json")) def index = new JsonSlurper().parse(file("pack/prism/modrinth.index.json")) - if (rootProject.pack_version != "26.2.0-alpha.215" + if (rootProject.pack_version != "26.2.0-alpha.216" || rootProject.onlyfun_version != "0.0.0-alpha.24" || rootProject.sanctuary_version != "0.0.0-alpha.120" || release.pack_version != rootProject.pack_version || index.versionId != rootProject.pack_version @@ -4251,7 +4251,7 @@ tasks.register("verifyCuisineCropsRelease") { def climate = file("itsalive/src/main/java/fr/koka99cab/sanctuary26/itsalive/agriculture/ClimateCropForaging.java").text def rice = file("itsalive/src/main/java/fr/koka99cab/sanctuary26/itsalive/agriculture/RiceCropBlock.java").text def bean = file("itsalive/src/main/java/fr/koka99cab/sanctuary26/itsalive/agriculture/BeanCropBlock.java").text - if (rootProject.pack_version != "26.2.0-alpha.215" + if (rootProject.pack_version != "26.2.0-alpha.216" || rootProject.itsalive_version != "0.0.0-alpha.36" || release.pack_version != rootProject.pack_version || index.versionId != rootProject.pack_version || migration.source?.pack_version != "26.2.0-alpha.193" @@ -4300,7 +4300,7 @@ tasks.register("verifyShopCsvBossGatesRelease") { def bossGate = file("onlyfun/src/main/java/fr/koka99cab/sanctuary26/onlyfun/shop/OnlyFunBossShopGate.java").text def catalog = file("onlyfun/src/main/java/fr/koka99cab/sanctuary26/onlyfun/shop/OnlyFunShopCatalog.java").text def offerCatalog = file("sanctuary/src/main/java/fr/koka99cab/sanctuary26/sanctuary/shop/ShopOfferCatalog.java").text - if (rootProject.pack_version != "26.2.0-alpha.215" + if (rootProject.pack_version != "26.2.0-alpha.216" || rootProject.onlyfun_version != "0.0.0-alpha.24" || rootProject.sanctuary_version != "0.0.0-alpha.120" || release.pack_version != rootProject.pack_version || index.versionId != rootProject.pack_version @@ -4346,7 +4346,7 @@ tasks.register("verifyCulinaryMailboxGrappleFixesRelease") { def release = new JsonSlurper().parse(file("pack/release.json")) def prism = new JsonSlurper().parse(file("pack/prism/modrinth.index.json")) def packwiz = file("pack/packwiz/pack.toml").text - if (rootProject.pack_version != "26.2.0-alpha.215" + if (rootProject.pack_version != "26.2.0-alpha.216" || migration.source?.pack_version != "26.2.0-alpha.195" || migration.target?.pack_version != "26.2.0-alpha.196" || migration.target?.modules != [ @@ -4364,10 +4364,10 @@ tasks.register("verifyCulinaryMailboxGrappleFixesRelease") { || migration.distribution?.jei?.target != "30.26.0.182" || migration.compatibility?.save_migration_required != false || migration.compatibility?.registry_ids_changed != false - || release.pack_version != "26.2.0-alpha.215" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack" - || prism.versionId != "26.2.0-alpha.215" - || !packwiz.contains('version = "26.2.0-alpha.215"')) { + || release.pack_version != "26.2.0-alpha.216" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.216.mrpack" + || prism.versionId != "26.2.0-alpha.216" + || !packwiz.contains('version = "26.2.0-alpha.216"')) { throw new GradleException("The alpha.196 culinary, mailbox and grapple release contract is incomplete") } } @@ -4392,7 +4392,7 @@ tasks.register("verifyQuestRequestsCauldronBatchesRelease") { def prism = new JsonSlurper().parse(file("pack/prism/modrinth.index.json")) def packwiz = file("pack/packwiz/pack.toml").text def sanctuaryManifest = new JsonSlurper().parse(file("sanctuary/src/main/resources/fabric.mod.json")) - if (rootProject.pack_version != "26.2.0-alpha.215" + if (rootProject.pack_version != "26.2.0-alpha.216" || rootProject.itsalive_version != "0.0.0-alpha.36" || rootProject.sanctuary_version != "0.0.0-alpha.120" || migration.source?.pack_version != "26.2.0-alpha.196" @@ -4412,10 +4412,10 @@ tasks.register("verifyQuestRequestsCauldronBatchesRelease") { || migration.distribution?.jei?.target != "30.26.0.186" || migration.compatibility?.sanctuary_target_network_protocol != 19 || sanctuaryManifest.custom?.sanctuary26?.network_protocol != 22 - || release.pack_version != "26.2.0-alpha.215" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack" - || prism.versionId != "26.2.0-alpha.215" - || !packwiz.contains('version = "26.2.0-alpha.215"')) { + || release.pack_version != "26.2.0-alpha.216" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.216.mrpack" + || prism.versionId != "26.2.0-alpha.216" + || !packwiz.contains('version = "26.2.0-alpha.216"')) { throw new GradleException("The alpha.197 quest-request and cauldron-batch release contract is incomplete") } } @@ -4442,7 +4442,7 @@ tasks.register("verifyFermentationBarrelAutomationRelease") { def packwiz = file("pack/packwiz/pack.toml").text def packwizIndex = file("pack/packwiz/index.toml").text def itsAliveManifest = new JsonSlurper().parse(file("itsalive/src/main/resources/fabric.mod.json")) - if (rootProject.pack_version != "26.2.0-alpha.215" + if (rootProject.pack_version != "26.2.0-alpha.216" || rootProject.itsalive_version != "0.0.0-alpha.36" || migration.source?.pack_version != "26.2.0-alpha.197" || migration.target?.pack_version != "26.2.0-alpha.198" @@ -4461,10 +4461,10 @@ tasks.register("verifyFermentationBarrelAutomationRelease") { || migration.distribution?.packwiz_index_refreshed != true || itsAliveManifest.custom?.sanctuary26?.data_version != 3 || itsAliveManifest.custom?.sanctuary26?.network_protocol != 4 - || release.pack_version != "26.2.0-alpha.215" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack" - || prism.versionId != "26.2.0-alpha.215" - || !packwiz.contains('version = "26.2.0-alpha.215"') + || release.pack_version != "26.2.0-alpha.216" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.216.mrpack" + || prism.versionId != "26.2.0-alpha.216" + || !packwiz.contains('version = "26.2.0-alpha.216"') || !packwizIndex.contains('file = "mods/itsalive-0.0.0-alpha.36.jar"')) { throw new GradleException("The alpha.198 fermentation barrel release contract is incomplete") } @@ -4492,7 +4492,7 @@ tasks.register("verifyQuestRequestContractsRelease") { def packwiz = file("pack/packwiz/pack.toml").text def packwizIndex = file("pack/packwiz/index.toml").text def sanctuaryManifest = new JsonSlurper().parse(file("sanctuary/src/main/resources/fabric.mod.json")) - if (rootProject.pack_version != "26.2.0-alpha.215" + if (rootProject.pack_version != "26.2.0-alpha.216" || rootProject.itsalive_version != "0.0.0-alpha.36" || rootProject.sanctuary_version != "0.0.0-alpha.120" || migration.source?.pack_version != "26.2.0-alpha.198" @@ -4506,10 +4506,10 @@ tasks.register("verifyQuestRequestContractsRelease") { || migration.quest_request_contracts?.chat_accept_revalidates_distance_owner_sign_and_claim != true || migration.compatibility?.sanctuary_target_network_protocol != 20 || sanctuaryManifest.custom?.sanctuary26?.network_protocol != 22 - || release.pack_version != "26.2.0-alpha.215" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack" - || prism.versionId != "26.2.0-alpha.215" - || !packwiz.contains('version = "26.2.0-alpha.215"') + || release.pack_version != "26.2.0-alpha.216" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.216.mrpack" + || prism.versionId != "26.2.0-alpha.216" + || !packwiz.contains('version = "26.2.0-alpha.216"') || !packwizIndex.contains('file = "mods/itsalive-0.0.0-alpha.36.jar"') || !packwizIndex.contains('file = "mods/sanctuary-0.0.0-alpha.120.jar"')) { throw new GradleException("The alpha.199 quest-request contract release is incomplete") @@ -4547,8 +4547,8 @@ tasks.register("verifyWeatherTntAmbianceRelease") { def ambianceManifest = new JsonSlurper().parse(file("ambiance/src/main/resources/fabric.mod.json")) def ouchManifest = new JsonSlurper().parse(file("ouch/src/main/resources/fabric.mod.json")) def rootBuild = file("build.gradle").text - if (rootProject.pack_version != "26.2.0-alpha.215" - || rootProject.ambiance_version != "0.0.0-alpha.18" + if (rootProject.pack_version != "26.2.0-alpha.216" + || rootProject.ambiance_version != "0.0.0-alpha.19" || rootProject.ouch_version != "0.0.0-alpha.10" || migration.source?.pack_version != "26.2.0-alpha.199" || migration.source?.modules != [ambiance: "0.0.0-alpha.11", ouch: "0.0.0-alpha.8"] @@ -4581,11 +4581,11 @@ tasks.register("verifyWeatherTntAmbianceRelease") { || !weatherTnt.contains("AmbianceDailyWeather.CLEAR") || !weatherTnt.contains("CLEAR_WEATHER_TICKS = 864_000") || weatherTnt.contains("setWeatherParameters") - || release.pack_version != "26.2.0-alpha.215" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack" - || prism.versionId != "26.2.0-alpha.215" - || !packwiz.contains('version = "26.2.0-alpha.215"') - || !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.18.jar"') + || release.pack_version != "26.2.0-alpha.216" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.216.mrpack" + || prism.versionId != "26.2.0-alpha.216" + || !packwiz.contains('version = "26.2.0-alpha.216"') + || !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.19.jar"') || !packwizIndex.contains('file = "mods/ouch-0.0.0-alpha.10.jar"')) { throw new GradleException("The alpha.200 Weather TNT and Ambiance release is incomplete") } @@ -4613,7 +4613,7 @@ tasks.register("verifyQuestRequestEscrowRelease") { def packwiz = file("pack/packwiz/pack.toml").text def packwizIndex = file("pack/packwiz/index.toml").text def sanctuaryManifest = new JsonSlurper().parse(file("sanctuary/src/main/resources/fabric.mod.json")) - if (rootProject.pack_version != "26.2.0-alpha.215" + if (rootProject.pack_version != "26.2.0-alpha.216" || rootProject.sanctuary_version != "0.0.0-alpha.120" || migration.source?.pack_version != "26.2.0-alpha.200" || migration.source?.modules?.sanctuary != "0.0.0-alpha.115" @@ -4628,10 +4628,10 @@ tasks.register("verifyQuestRequestEscrowRelease") { || migration.compatibility?.sanctuary_target_network_protocol != 21 || sanctuaryManifest.custom?.sanctuary26?.data_version != 11 || sanctuaryManifest.custom?.sanctuary26?.network_protocol != 22 - || release.pack_version != "26.2.0-alpha.215" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack" - || prism.versionId != "26.2.0-alpha.215" - || !packwiz.contains('version = "26.2.0-alpha.215"') + || release.pack_version != "26.2.0-alpha.216" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.216.mrpack" + || prism.versionId != "26.2.0-alpha.216" + || !packwiz.contains('version = "26.2.0-alpha.216"') || !packwizIndex.contains('file = "mods/sanctuary-0.0.0-alpha.120.jar"')) { throw new GradleException("The alpha.201 quest-request escrow release is incomplete") } @@ -4667,7 +4667,7 @@ tasks.register("verifyWaystoneShopCulinaryAlpha202Release") { "iliketomoveit/src/main/resources/fabric.mod.json")) def sanctuaryManifest = new JsonSlurper().parse(file( "sanctuary/src/main/resources/fabric.mod.json")) - if (rootProject.pack_version != "26.2.0-alpha.215" + if (rootProject.pack_version != "26.2.0-alpha.216" || rootProject.anotherworld_version != "0.0.0-alpha.55" || rootProject.itsalive_version != "0.0.0-alpha.36" || rootProject.iliketomoveit_version != "0.0.0-alpha.15" @@ -4707,10 +4707,10 @@ tasks.register("verifyWaystoneShopCulinaryAlpha202Release") { || moveItManifest.custom?.sanctuary26?.network_protocol != 5 || sanctuaryManifest.custom?.sanctuary26?.data_version != 11 || sanctuaryManifest.custom?.sanctuary26?.network_protocol != 22 - || release.pack_version != "26.2.0-alpha.215" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack" - || prism.versionId != "26.2.0-alpha.215" - || !packwiz.contains('version = "26.2.0-alpha.215"') + || release.pack_version != "26.2.0-alpha.216" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.216.mrpack" + || prism.versionId != "26.2.0-alpha.216" + || !packwiz.contains('version = "26.2.0-alpha.216"') || !packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.55.jar"') || !packwizIndex.contains('file = "mods/itsalive-0.0.0-alpha.36.jar"') || !packwizIndex.contains('file = "mods/iliketomoveit-0.0.0-alpha.15.jar"') @@ -4827,7 +4827,7 @@ tasks.register("verifySafeVaultFeature") { def image = javax.imageio.ImageIO.read(file("anotherworld/src/main/resources/assets/anotherworld/textures/${path}")) image == null || image.width != size[0] || image.height != size[1] }.keySet() - if (rootProject.pack_version != "26.2.0-alpha.215" + if (rootProject.pack_version != "26.2.0-alpha.216" || rootProject.anotherworld_version != "0.0.0-alpha.55" || rootProject.sanctuary_version != "0.0.0-alpha.120" || migration.schema_version != 1 @@ -5019,7 +5019,7 @@ tasks.register("verifySafeVaultInterfaceAlpha203Release") { def packwiz = file("pack/packwiz/pack.toml").text def packwizIndex = file("pack/packwiz/index.toml").text def jeiFiles = prism.files.findAll { it.path == "mods/jei-26.2-fabric-30.28.0.193.jar" } - if (rootProject.pack_version != "26.2.0-alpha.215" + if (rootProject.pack_version != "26.2.0-alpha.216" || rootProject.anotherworld_version != "0.0.0-alpha.55" || migration.source?.pack_version != "26.2.0-alpha.202" || migration.source?.modules != [anotherworld: "0.0.0-alpha.50"] @@ -5037,9 +5037,9 @@ tasks.register("verifySafeVaultInterfaceAlpha203Release") { || migration.distribution?.jei?.modrinth_version_id != "XXTFqqwG" || migration.distribution?.jei?.prism_manifest_updated != true || release.pack_version != rootProject.pack_version - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.216.mrpack" || prism.versionId != rootProject.pack_version - || !packwiz.contains('version = "26.2.0-alpha.215"') + || !packwiz.contains('version = "26.2.0-alpha.216"') || !packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.55.jar"') || packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.50.jar"') || jeiFiles.size() != 1 @@ -5065,7 +5065,7 @@ tasks.register("verifySafeVaultFixAlpha204Release") { def packwiz = file("pack/packwiz/pack.toml").text def packwizIndex = file("pack/packwiz/index.toml").text def jeiFiles = prism.files.findAll { it.path == "mods/jei-26.2-fabric-30.28.0.193.jar" } - if (rootProject.pack_version != "26.2.0-alpha.215" + if (rootProject.pack_version != "26.2.0-alpha.216" || rootProject.anotherworld_version != "0.0.0-alpha.55" || migration.source?.pack_version != "26.2.0-alpha.203" || migration.source?.modules != [anotherworld: "0.0.0-alpha.51"] @@ -5091,9 +5091,9 @@ tasks.register("verifySafeVaultFixAlpha204Release") { || migration.distribution?.jei?.modrinth_version_id != "OcMayhUH" || migration.distribution?.jei?.prism_manifest_updated != true || release.pack_version != rootProject.pack_version - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.216.mrpack" || prism.versionId != rootProject.pack_version - || !packwiz.contains('version = "26.2.0-alpha.215"') + || !packwiz.contains('version = "26.2.0-alpha.216"') || !packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.55.jar"') || packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.51.jar"') || jeiFiles.size() != 1 @@ -5119,7 +5119,7 @@ tasks.register("verifySafeVaultCubeAlpha205Release") { def packwiz = file("pack/packwiz/pack.toml").text def packwizIndex = file("pack/packwiz/index.toml").text def jeiFiles = prism.files.findAll { it.path == "mods/jei-26.2-fabric-30.28.0.193.jar" } - if (rootProject.pack_version != "26.2.0-alpha.215" + if (rootProject.pack_version != "26.2.0-alpha.216" || rootProject.anotherworld_version != "0.0.0-alpha.55" || migration.source?.pack_version != "26.2.0-alpha.204" || migration.source?.modules != [anotherworld: "0.0.0-alpha.52"] @@ -5148,9 +5148,9 @@ tasks.register("verifySafeVaultCubeAlpha205Release") { || migration.distribution?.jei?.modrinth_version_id != "NtfJDMhk" || migration.distribution?.jei?.prism_manifest_updated != true || release.pack_version != rootProject.pack_version - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.216.mrpack" || prism.versionId != rootProject.pack_version - || !packwiz.contains('version = "26.2.0-alpha.215"') + || !packwiz.contains('version = "26.2.0-alpha.216"') || !packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.55.jar"') || packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.52.jar"') || jeiFiles.size() != 1 @@ -5177,7 +5177,7 @@ tasks.register("verifySafeVaultCtmAlpha206Release") { def packwiz = file("pack/packwiz/pack.toml").text def packwizIndex = file("pack/packwiz/index.toml").text def jeiFiles = prism.files.findAll { it.path == "mods/jei-26.2-fabric-30.28.0.193.jar" } - if (rootProject.pack_version != "26.2.0-alpha.215" + if (rootProject.pack_version != "26.2.0-alpha.216" || rootProject.anotherworld_version != "0.0.0-alpha.55" || migration.source?.pack_version != "26.2.0-alpha.205" || migration.source?.modules != [anotherworld: "0.0.0-alpha.53"] @@ -5200,9 +5200,9 @@ tasks.register("verifySafeVaultCtmAlpha206Release") { || migration.compatibility?.pack_release_updated != true || migration.distribution?.packwiz_index_refreshed != true || release.pack_version != rootProject.pack_version - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.216.mrpack" || prism.versionId != rootProject.pack_version - || !packwiz.contains('version = "26.2.0-alpha.215"') + || !packwiz.contains('version = "26.2.0-alpha.216"') || !packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.55.jar"') || packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.53.jar"') || jeiFiles.size() != 1 @@ -5229,7 +5229,7 @@ tasks.register("verifySafeVaultUnlimitedAlpha207Release") { def packwiz = file("pack/packwiz/pack.toml").text def packwizIndex = file("pack/packwiz/index.toml").text def jeiFiles = prism.files.findAll { it.path == "mods/jei-26.2-fabric-30.28.0.193.jar" } - if (rootProject.pack_version != "26.2.0-alpha.215" + if (rootProject.pack_version != "26.2.0-alpha.216" || rootProject.anotherworld_version != "0.0.0-alpha.55" || migration.source?.pack_version != "26.2.0-alpha.206" || migration.source?.modules != [anotherworld: "0.0.0-alpha.54"] @@ -5259,9 +5259,9 @@ tasks.register("verifySafeVaultUnlimitedAlpha207Release") { || migration.compatibility?.pack_release_updated != true || migration.distribution?.packwiz_index_refreshed != true || release.pack_version != rootProject.pack_version - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.216.mrpack" || prism.versionId != rootProject.pack_version - || !packwiz.contains('version = "26.2.0-alpha.215"') + || !packwiz.contains('version = "26.2.0-alpha.216"') || !packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.55.jar"') || packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.54.jar"') || jeiFiles.size() != 1 @@ -5317,9 +5317,9 @@ tasks.register("verifyCanapliaFoundation") { "itsalive/src/main/java/fr/koka99cab/sanctuary26/itsalive/ItsAliveMod.java").text def visualApiSource = file( "ambiance/src/main/java/fr/koka99cab/sanctuary26/ambiance/api/visual/AmbianceVisualEffectApi.java").text - if (rootProject.pack_version != "26.2.0-alpha.215" + if (rootProject.pack_version != "26.2.0-alpha.216" || rootProject.itsalive_version != "0.0.0-alpha.36" - || rootProject.ambiance_version != "0.0.0-alpha.18" + || rootProject.ambiance_version != "0.0.0-alpha.19" || migration.issue != 35 || migration.source?.fabric_id != "canaplia" || migration.source?.version != "2.0.0" @@ -5569,8 +5569,8 @@ tasks.register("verifyCanapliaAlpha209Release") { ambiance: "0.0.0-alpha.14", itsalive: "0.0.0-alpha.33", onlyfun: "0.0.0-alpha.20"] - if (rootProject.pack_version != "26.2.0-alpha.215" - || rootProject.ambiance_version != "0.0.0-alpha.18" + if (rootProject.pack_version != "26.2.0-alpha.216" + || rootProject.ambiance_version != "0.0.0-alpha.19" || rootProject.itsalive_version != "0.0.0-alpha.36" || rootProject.onlyfun_version != "0.0.0-alpha.24" || migration.source?.pack_version != "26.2.0-alpha.207" @@ -5617,10 +5617,10 @@ tasks.register("verifyCanapliaAlpha209Release") { || fixMigration.compatibility?.network_protocol_changed != false || fixMigration.distribution?.pack_release_updated != true || release.pack_version != rootProject.pack_version - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.216.mrpack" || prism.versionId != rootProject.pack_version - || !packwiz.contains('version = "26.2.0-alpha.215"') - || !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.18.jar"') + || !packwiz.contains('version = "26.2.0-alpha.216"') + || !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.19.jar"') || !packwizIndex.contains('file = "mods/itsalive-0.0.0-alpha.36.jar"') || !packwizIndex.contains('file = "mods/onlyfun-0.0.0-alpha.24.jar"') || packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.12.jar"') @@ -5670,7 +5670,7 @@ tasks.register("verifyAlpha210Release") { iliketomoveit: "0.0.0-alpha.15", itsalive: "0.0.0-alpha.35"] def currentModules = [ - ambiance: "0.0.0-alpha.18", + ambiance: "0.0.0-alpha.19", sanctuary: "0.0.0-alpha.120", onlyfun: "0.0.0-alpha.24", ouch: "0.0.0-alpha.10", @@ -5687,7 +5687,7 @@ tasks.register("verifyAlpha210Release") { def jeiFiles = prism.files.findAll { it.path == "mods/jei-26.2-fabric-30.28.0.193.jar" } - if (rootProject.pack_version != "26.2.0-alpha.215" + if (rootProject.pack_version != "26.2.0-alpha.216" || rootProject.sanctuary_version != "0.0.0-alpha.120" || rootProject.onlyfun_version != "0.0.0-alpha.24" || rootProject.iliketomoveit_version != expectedTarget.iliketomoveit @@ -5733,10 +5733,10 @@ tasks.register("verifyAlpha210Release") { || manifests.iliketomoveit.custom?.sanctuary26?.network_protocol != 5 || manifests.itsalive.custom?.sanctuary26?.data_version != 3 || manifests.itsalive.custom?.sanctuary26?.network_protocol != 4 - || release.pack_version != "26.2.0-alpha.215" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack" - || prism.versionId != "26.2.0-alpha.215" - || !packwiz.contains('version = "26.2.0-alpha.215"') + || release.pack_version != "26.2.0-alpha.216" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.216.mrpack" + || prism.versionId != "26.2.0-alpha.216" + || !packwiz.contains('version = "26.2.0-alpha.216"') || requiredJars.any { !packwizIndex.contains(it) } || obsoleteJars.any { packwizIndex.contains(it) } || jeiFiles.size() != 1 @@ -5784,8 +5784,8 @@ tasks.register("verifyAlpha211Release") { sanctuary: "0.0.0-alpha.119"] def currentModules = expectedTarget + [ sanctuary: "0.0.0-alpha.120", - ambiance: "0.0.0-alpha.18"] - def workspaceModules = currentModules + [ambiance: "0.0.0-alpha.18"] + ambiance: "0.0.0-alpha.19"] + def workspaceModules = currentModules + [ambiance: "0.0.0-alpha.19"] def expectedDataVersions = [ambiance: 2, itsalive: 3, onlyfun: 2, ouch: 1, sanctuary: 11] def expectedProtocols = [ambiance: 6, itsalive: 4, onlyfun: 3, ouch: 1, sanctuary: 22] def manifests = expectedTarget.collectEntries { id, version -> @@ -5810,7 +5810,7 @@ tasks.register("verifyAlpha211Release") { def jeiFiles = prism.files.findAll { it.path == "mods/jei-26.2-fabric-30.28.0.193.jar" } - if (rootProject.pack_version != "26.2.0-alpha.215" + if (rootProject.pack_version != "26.2.0-alpha.216" || workspaceModules.any { id, version -> rootProject.property("${id}_version") != version } || migration.source?.pack_version != "26.2.0-alpha.210" || migration.source?.modules != expectedSource @@ -5838,9 +5838,9 @@ tasks.register("verifyAlpha211Release") { || migration.distribution?.prism_modrinth_index_updated != true || migration.distribution?.shared_client_server_mrpack != true || release.pack_version != rootProject.pack_version - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.216.mrpack" || prism.versionId != rootProject.pack_version - || !packwiz.contains('version = "26.2.0-alpha.215"') + || !packwiz.contains('version = "26.2.0-alpha.216"') || requiredJars.any { !packwizIndex.contains(it) } || obsoleteJars.any { packwizIndex.contains(it) } || prism.files?.size() != 5 @@ -5848,7 +5848,7 @@ tasks.register("verifyAlpha211Release") { || jeiFiles[0].hashes?.sha1 != "494f9dc787d6c9cd9d32793da2784ab16834faf3" || jeiFiles[0].hashes?.sha512 != "0869f4d5840a732a04bedc7684b40140f087f3d759066c206d9d1ec710007f7c9585e4f5ebb04f10e56bef1cf2eddc6978bb2b2c93541cff5fcf7e1609859468" || !changelog.contains("## `26.2.0-alpha.211`") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.215`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.216`**")) { throw new GradleException("The alpha.211 Abjection and gameplay-polish release is incomplete") } } @@ -5882,7 +5882,7 @@ tasks.register("verifyAlpha212Release") { def jeiFiles = prism.files.findAll { it.path == "mods/jei-26.2-fabric-30.28.0.193.jar" } - if (rootProject.pack_version != "26.2.0-alpha.215" + if (rootProject.pack_version != "26.2.0-alpha.216" || rootProject.sanctuary_version != "0.0.0-alpha.120" || migration.source?.pack_version != "26.2.0-alpha.211" || migration.source?.modules != [sanctuary: "0.0.0-alpha.119"] @@ -5904,16 +5904,16 @@ tasks.register("verifyAlpha212Release") { || manifest.custom?.sanctuary26?.data_version != 11 || manifest.custom?.sanctuary26?.network_protocol != 22 || !minecraftMixin.contains('method = "pickBlockOrEntity"') - || release.pack_version != "26.2.0-alpha.215" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack" - || prism.versionId != "26.2.0-alpha.215" + || release.pack_version != "26.2.0-alpha.216" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.216.mrpack" + || prism.versionId != "26.2.0-alpha.216" || prism.files?.size() != 5 || jeiFiles.size() != 1 - || !packwiz.contains('version = "26.2.0-alpha.215"') + || !packwiz.contains('version = "26.2.0-alpha.216"') || !packwizIndex.contains('file = "mods/sanctuary-0.0.0-alpha.120.jar"') || packwizIndex.contains('file = "mods/sanctuary-0.0.0-alpha.119.jar"') || !changelog.contains("## `26.2.0-alpha.212`") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.215`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.216`**")) { throw new GradleException("The alpha.212 Black Market startup-fix release is incomplete") } } @@ -5947,8 +5947,8 @@ tasks.register("verifyAlpha213Release") { def jeiFiles = prism.files.findAll { it.path == "mods/jei-26.2-fabric-30.28.0.193.jar" } - if (rootProject.pack_version != "26.2.0-alpha.215" - || rootProject.ambiance_version != "0.0.0-alpha.18" + if (rootProject.pack_version != "26.2.0-alpha.216" + || rootProject.ambiance_version != "0.0.0-alpha.19" || migration.source?.pack_version != "26.2.0-alpha.212" || migration.source?.modules != [ambiance: "0.0.0-alpha.15"] || migration.target?.pack_version != "26.2.0-alpha.213" @@ -5971,16 +5971,16 @@ tasks.register("verifyAlpha213Release") { || manifest.custom?.sanctuary26?.network_protocol != 6 || !levelEventMixin.contains('@Mixin(LevelEventHandler.class)') || !levelEventMixin.contains('@Inject(method = "levelEvent"') - || release.pack_version != "26.2.0-alpha.215" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack" - || prism.versionId != "26.2.0-alpha.215" + || release.pack_version != "26.2.0-alpha.216" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.216.mrpack" + || prism.versionId != "26.2.0-alpha.216" || prism.files?.size() != 5 || jeiFiles.size() != 1 - || !packwiz.contains('version = "26.2.0-alpha.215"') - || !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.18.jar"') + || !packwiz.contains('version = "26.2.0-alpha.216"') + || !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.19.jar"') || packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.15.jar"') || !changelog.contains("## `26.2.0-alpha.213`") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.215`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.216`**")) { throw new GradleException("The alpha.213 Ambiance startup-fix release is incomplete") } } @@ -6015,8 +6015,8 @@ tasks.register("verifyAlpha214Release") { "ambiance/src/main/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscAudioPlayer.java").text def urlSmoke = file( "ambiance/src/test/java/fr/koka99cab/sanctuary26/ambiance/white_disc/WhiteDiscUrlSmoke.java").text - if (rootProject.pack_version != "26.2.0-alpha.215" - || rootProject.ambiance_version != "0.0.0-alpha.18" + if (rootProject.pack_version != "26.2.0-alpha.216" + || rootProject.ambiance_version != "0.0.0-alpha.19" || migration.source?.pack_version != "26.2.0-alpha.213" || migration.source?.modules != [ambiance: "0.0.0-alpha.16"] || migration.target?.pack_version != "26.2.0-alpha.214" @@ -6044,16 +6044,16 @@ tasks.register("verifyAlpha214Release") { || !audioPlayer.contains('message.ambiance.white_disc.loading') || !audioPlayer.contains('message.ambiance.white_disc.failed') || !urlSmoke.contains("https://youtu.be/Ue5ZBe-GzSM?si=78LSbtBQzUYzhA2Y") - || release.pack_version != "26.2.0-alpha.215" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack" - || prism.versionId != "26.2.0-alpha.215" + || release.pack_version != "26.2.0-alpha.216" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.216.mrpack" + || prism.versionId != "26.2.0-alpha.216" || prism.files?.size() != 5 - || !packwiz.contains('version = "26.2.0-alpha.215"') - || !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.18.jar"') + || !packwiz.contains('version = "26.2.0-alpha.216"') + || !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.19.jar"') || packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.16.jar"') || !changelog.contains("## `26.2.0-alpha.214`") || changelog.contains("## Modifications non distribuées") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.215`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.216`**")) { throw new GradleException("The alpha.214 white-disc solo synchronization release is incomplete") } } @@ -6094,8 +6094,8 @@ tasks.register("verifyAlpha215Release") { "ambiance/src/main/java/fr/koka99cab/sanctuary26/ambiance/client/audio/LavaplayerAudioStream.java").text def playbackSmoke = file( "ambiance/src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscPlaybackSmoke.java").text - if (rootProject.pack_version != "26.2.0-alpha.215" - || rootProject.ambiance_version != "0.0.0-alpha.18" + if (rootProject.pack_version != "26.2.0-alpha.216" + || rootProject.ambiance_version != "0.0.0-alpha.19" || migration.source?.pack_version != "26.2.0-alpha.214" || migration.source?.modules != [ambiance: "0.0.0-alpha.17"] || migration.target?.pack_version != "26.2.0-alpha.215" @@ -6127,30 +6127,127 @@ tasks.register("verifyAlpha215Release") { || !audioPlayer.contains("failPlayback(client, key, failedPlayer)") || !audioPlayer.contains("handle.execute(channel -> channel.stop())") || audioPlayer.contains(".release()") - || !audioStream.contains("player.provide(2, TimeUnit.SECONDS)") - || !audioStream.contains("frame = player.provide()") + || !audioStream.contains("INITIAL_FRAME_WAIT_MILLIS = 2_000L") + || !audioStream.contains("CONTINUATION_FRAME_WAIT_MILLIS = 250L") + || !audioStream.contains("player.provide(waitMillis, TimeUnit.MILLISECONDS)") || !audioStream.contains("while (output.hasRemaining()) output.put((byte) 0)") || !playbackSmoke.contains("https://www.youtube.com/watch?v=Ue5ZBe-GzSM") || !playbackSmoke.contains("Decoded audible PCM data") - || release.pack_version != "26.2.0-alpha.215" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack" - || prism.versionId != "26.2.0-alpha.215" + || release.pack_version != "26.2.0-alpha.216" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.216.mrpack" + || prism.versionId != "26.2.0-alpha.216" || prism.files?.size() != 5 - || !packwiz.contains('version = "26.2.0-alpha.215"') - || !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.18.jar"') + || !packwiz.contains('version = "26.2.0-alpha.216"') + || !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.19.jar"') || packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.17.jar"') || !changelog.contains("## `26.2.0-alpha.215`") || changelog.contains("## Modifications non distribuées") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.215`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.216`**")) { throw new GradleException("The alpha.215 resilient white-disc playback release is incomplete") } } } +tasks.register("verifyAlpha216Release") { + group = "verification" + description = "Checks the Sanctuary 26.2.0-alpha.216 white-disc audio-quality release." + inputs.file(file("pack/migrations/26.2.0-alpha.215-white-disc-audio-quality-to-alpha.216.json")) + inputs.file(file("pack/release.json")) + inputs.file(file("pack/prism/modrinth.index.json")) + inputs.file(file("pack/packwiz/pack.toml")) + inputs.file(file("pack/packwiz/index.toml")) + inputs.file(file("CHANGELOG.md")) + inputs.file(file("README.md")) + inputs.file(file("ambiance/src/main/resources/fabric.mod.json")) + inputs.file(file("ambiance/build.gradle")) + inputs.file(file( + "ambiance/src/main/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscAudioPlayer.java")) + inputs.file(file( + "ambiance/src/main/java/fr/koka99cab/sanctuary26/ambiance/client/audio/LavaplayerAudioStream.java")) + inputs.file(file( + "ambiance/src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/LavaplayerAudioStreamSmoke.java")) + inputs.file(file( + "ambiance/src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscPlaybackSmoke.java")) + doLast { + def migration = new JsonSlurper().parse(file( + "pack/migrations/26.2.0-alpha.215-white-disc-audio-quality-to-alpha.216.json")) + def release = new JsonSlurper().parse(file("pack/release.json")) + def prism = new JsonSlurper().parse(file("pack/prism/modrinth.index.json")) + def packwiz = file("pack/packwiz/pack.toml").text + def packwizIndex = file("pack/packwiz/index.toml").text + def changelog = file("CHANGELOG.md").text + def readme = file("README.md").text + def manifest = new JsonSlurper().parse(file("ambiance/src/main/resources/fabric.mod.json")) + def ambianceBuild = file("ambiance/build.gradle").text + def audioPlayer = file( + "ambiance/src/main/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscAudioPlayer.java").text + def audioStream = file( + "ambiance/src/main/java/fr/koka99cab/sanctuary26/ambiance/client/audio/LavaplayerAudioStream.java").text + def streamSmoke = file( + "ambiance/src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/LavaplayerAudioStreamSmoke.java").text + def playbackSmoke = file( + "ambiance/src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscPlaybackSmoke.java").text + if (rootProject.pack_version != "26.2.0-alpha.216" + || rootProject.ambiance_version != "0.0.0-alpha.19" + || migration.source?.pack_version != "26.2.0-alpha.215" + || migration.source?.modules != [ambiance: "0.0.0-alpha.18"] + || migration.target?.pack_version != "26.2.0-alpha.216" + || migration.target?.modules != [ambiance: "0.0.0-alpha.19"] + || migration.features?.white_disc_continuous_pcm_buffering != true + || migration.features?.sample_rate_hz != 48_000 + || migration.features?.channel_count != 1 + || migration.features?.sample_size_bits != 16 + || migration.features?.minecraft_stream_buffer_seconds != 1 + || migration.features?.minecraft_initial_buffer_count != 4 + || migration.features?.initial_frame_wait_millis != 2_000 + || migration.features?.continuation_frame_wait_millis != 250 + || migration.features?.openal_pitch != 1.0 + || migration.features?.live_pcm_smoke_video_id != "Ue5ZBe-GzSM" + || migration.features?.minimum_live_audible_byte_ratio != 0.75 + || migration.features?.deterministic_stream_smoke != true + || migration.compatibility?.new_world_required != false + || migration.compatibility?.save_reset_required != false + || migration.compatibility?.existing_saves_supported != true + || migration.compatibility?.registry_ids_changed != false + || migration.compatibility?.ambiance_data_version != 2 + || migration.compatibility?.ambiance_network_protocol != 6 + || migration.distribution?.pack_release_updated != true + || migration.distribution?.packwiz_index_refreshed != true + || migration.distribution?.prism_modrinth_index_updated != true + || migration.distribution?.shared_client_server_mrpack != true + || manifest.custom?.sanctuary26?.data_version != 2 + || manifest.custom?.sanctuary26?.network_protocol != 6 + || !ambianceBuild.contains('tasks.register("whiteDiscStreamSmoke"') + || !audioPlayer.contains("channel.setPitch(1.0F)") + || !audioStream.contains("SAMPLE_RATE = 48_000") + || !audioStream.contains("INITIAL_FRAME_WAIT_MILLIS = 2_000L") + || !audioStream.contains("CONTINUATION_FRAME_WAIT_MILLIS = 250L") + || !audioStream.contains("player.provide(waitMillis, TimeUnit.MILLISECONDS)") + || !audioStream.contains("new AudioFormat(SAMPLE_RATE, 16, 1, true, false)") + || !streamSmoke.contains("FRAMES_PER_SECOND") + || !streamSmoke.contains("PCM frames were not read with bounded waits") + || !playbackSmoke.contains("audibleRatio < 0.75") + || !playbackSmoke.contains("LavaplayerAudioStream.SAMPLE_RATE * 2 * 4") + || release.pack_version != "26.2.0-alpha.216" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.216.mrpack" + || prism.versionId != "26.2.0-alpha.216" + || prism.files?.size() != 5 + || !packwiz.contains('version = "26.2.0-alpha.216"') + || !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.19.jar"') + || packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.18.jar"') + || !changelog.contains("## `26.2.0-alpha.216`") + || changelog.contains("## Modifications non distribuées") + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.216`**")) { + throw new GradleException("The alpha.216 white-disc audio-quality release is incomplete") + } + } +} + tasks.named("verifyWorkspace") { dependsOn tasks.named("verifyAlpha213Release") dependsOn tasks.named("verifyAlpha214Release") dependsOn tasks.named("verifyAlpha215Release") + dependsOn tasks.named("verifyAlpha216Release") } tasks.named("check") { diff --git a/gradle.properties b/gradle.properties index d79ac4b..e4caad8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ fabric_api_version=0.158.0+26.2 # Standby modules stay at zero until their migration really begins. mod_version=0.0.0-alpha.0 module_lifecycle=standby -ambiance_version=0.0.0-alpha.18 +ambiance_version=0.0.0-alpha.19 ambiance_lifecycle=active redstoner_version=0.0.0-alpha.10 redstoner_lifecycle=active @@ -30,5 +30,5 @@ onlyfun_version=0.0.0-alpha.24 onlyfun_lifecycle=active sanctuary_version=0.0.0-alpha.120 sanctuary_lifecycle=active -pack_version=26.2.0-alpha.215 +pack_version=26.2.0-alpha.216 maven_group=fr.koka99cab.sanctuary26 diff --git a/pack/migrations/26.2.0-alpha.215-white-disc-audio-quality-to-alpha.216.json b/pack/migrations/26.2.0-alpha.215-white-disc-audio-quality-to-alpha.216.json new file mode 100644 index 0000000..2ec0825 --- /dev/null +++ b/pack/migrations/26.2.0-alpha.215-white-disc-audio-quality-to-alpha.216.json @@ -0,0 +1,43 @@ +{ + "schema_version": 1, + "source": { + "pack_version": "26.2.0-alpha.215", + "modules": { + "ambiance": "0.0.0-alpha.18" + } + }, + "target": { + "pack_version": "26.2.0-alpha.216", + "modules": { + "ambiance": "0.0.0-alpha.19" + } + }, + "features": { + "white_disc_continuous_pcm_buffering": true, + "sample_rate_hz": 48000, + "channel_count": 1, + "sample_size_bits": 16, + "minecraft_stream_buffer_seconds": 1, + "minecraft_initial_buffer_count": 4, + "initial_frame_wait_millis": 2000, + "continuation_frame_wait_millis": 250, + "openal_pitch": 1.0, + "live_pcm_smoke_video_id": "Ue5ZBe-GzSM", + "minimum_live_audible_byte_ratio": 0.75, + "deterministic_stream_smoke": true + }, + "compatibility": { + "new_world_required": false, + "save_reset_required": false, + "existing_saves_supported": true, + "registry_ids_changed": false, + "ambiance_data_version": 2, + "ambiance_network_protocol": 6 + }, + "distribution": { + "pack_release_updated": true, + "packwiz_index_refreshed": true, + "prism_modrinth_index_updated": true, + "shared_client_server_mrpack": true + } +} diff --git a/pack/packwiz/index.toml b/pack/packwiz/index.toml index d146378..ecabcdb 100644 --- a/pack/packwiz/index.toml +++ b/pack/packwiz/index.toml @@ -13,16 +13,16 @@ file = "instance-icon.png" hash = "41f4f4c88c71d0a23446d5014f7407d55ad477441847099cad24492b032335a0" [[files]] -file = "mods/ambiance-0.0.0-alpha.18.jar" -hash = "c029bbdf428e4037c22185680629b641c8bd6e60465fa72e3498b88bdc8d74f9" +file = "mods/ambiance-0.0.0-alpha.19.jar" +hash = "d3810b758e073d74efbaa501e39b0865335baf1089ff76a2554d24c6e13188ee" [[files]] file = "mods/anotherworld-0.0.0-alpha.55.jar" -hash = "c2649632bbce4ac134cc7cb6bd17b318f395fe878a1e61fdbdfffb880415f4aa" +hash = "56015a9d3c3517c948e336eab973205f84772a4f3a0b790e6f2832824ee44f3a" [[files]] file = "mods/events-0.0.0-alpha.0.jar" -hash = "4cb03d4d24c469e2cf578a1f46d93bbaa69ecc26e83f9a786758cee744fe160d" +hash = "bcc501a0fd6e8074cb3c4de26f607952d7ea63d630a697d95bfa59e90feae057" [[files]] file = "mods/fabric-api.pw.toml" @@ -31,7 +31,7 @@ metafile = true [[files]] file = "mods/iliketomoveit-0.0.0-alpha.15.jar" -hash = "3adaa6926d0a22d6c7f3a30260457d2e7ddc3ce145fa84d7b1156305645400a5" +hash = "551e354b96bb35ed8d64b26a4aac85d1d9441be592ed9fc62d6cd359e0e0e0c5" [[files]] file = "mods/iris.pw.toml" @@ -40,7 +40,7 @@ metafile = true [[files]] file = "mods/itsalive-0.0.0-alpha.36.jar" -hash = "9cfcc87d6018573fb45a37b71ceb019ba65253ef973cdc8b5c39a78792bff691" +hash = "3ff1e1ee2156553b78bf0bded03140d34844f7ab7f0ea6b48929d2c61a8c34bc" [[files]] file = "mods/jei.pw.toml" @@ -49,23 +49,23 @@ metafile = true [[files]] file = "mods/masterkey-0.0.0-alpha.8.jar" -hash = "c88d26fd649ad841b69d7fb72b075c392e4b878bc1bdeea811dd3d549625b33b" +hash = "268b30dcb808d8d2db1b909863beb9974b432fa558e7cd516dde811f600fd66e" [[files]] file = "mods/onlyfun-0.0.0-alpha.24.jar" -hash = "a3c50be3b95705c5dd8b547599610af8332765215f1749818a18e504a00866a4" +hash = "e6b89c1958449fb5bb70bb011df26cecc8f91a224b79788e96827a3897dfba4a" [[files]] file = "mods/ouch-0.0.0-alpha.10.jar" -hash = "0304e064ac3e497c9f8fcf8836575add04ea96f46d35fdbe6da50e926c070ff1" +hash = "d12d57580015a829f6fc31310cf5724bad1b442380aaf6272194caeed21a50fc" [[files]] file = "mods/redstoner-0.0.0-alpha.10.jar" -hash = "db41fcbd3daab88d17daf03ae5f7bc0aa134d6e1663ff6edfd80a7983f13a779" +hash = "d210ed751188e7e3e5ce197f498518c06cb5673e4057103cd0964c1a8d2b0066" [[files]] file = "mods/sanctuary-0.0.0-alpha.120.jar" -hash = "6f67724d6813d473ea06c62cdfd5d617a27199d6061895b89f62bb5d31becb8b" +hash = "f82fc135319d0ad25bed49f2fe924d506761391343265add2efd6c73d55f939a" [[files]] file = "mods/simple-voice-chat.pw.toml" diff --git a/pack/packwiz/pack.toml b/pack/packwiz/pack.toml index e0ca13f..6ee6d9a 100644 --- a/pack/packwiz/pack.toml +++ b/pack/packwiz/pack.toml @@ -1,12 +1,12 @@ name = "Sanctuary 26.2" author = "KOKA99CAB" -version = "26.2.0-alpha.215" +version = "26.2.0-alpha.216" pack-format = "packwiz:1.1.0" [index] file = "index.toml" hash-format = "sha256" -hash = "17231ac01c162a453e9000ee6419f7fbc884cf4b94c3b0956c12596cf36df9dd" +hash = "7a9a44c1f7dcd46aab475cdd2ac078758f320a550386140d89af994acd7c29d1" [versions] fabric = "0.19.3" diff --git a/pack/prism/modrinth.index.json b/pack/prism/modrinth.index.json index f2d6442..753fb7d 100644 --- a/pack/prism/modrinth.index.json +++ b/pack/prism/modrinth.index.json @@ -3,7 +3,7 @@ "game": "minecraft", "name": "Sanctuary 26.2", "summary": "Sanctuary 26.2 — progression, exploration, worldgen and multiplayer systems by KOKA99CAB.", - "versionId": "26.2.0-alpha.215", + "versionId": "26.2.0-alpha.216", "files": [ { "path": "mods/fabric-api-0.158.0+26.2.jar", diff --git a/pack/release.json b/pack/release.json index 0bd3694..144b746 100644 --- a/pack/release.json +++ b/pack/release.json @@ -1,6 +1,6 @@ { "schema_version": 1, - "pack_version": "26.2.0-alpha.215", + "pack_version": "26.2.0-alpha.216", "release_channel": "alpha", "minecraft_version": "26.2", "fabric_loader_version": "0.19.3", @@ -9,7 +9,7 @@ "project_id": "FgOqyAXd", "project_slug": "sanctuary-koka99", "project_url": "https://modrinth.com/modpack/sanctuary-koka99", - "primary_file": "sanctuary-26.2.0-alpha.215.mrpack", + "primary_file": "sanctuary-26.2.0-alpha.216.mrpack", "shared_client_server_pack": true, "update_owner": "packwiz-installer", "check_on_launch": true, -- 2.54.0