Compare commits
18
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9e35c244ec | ||
|
|
e82cb33407 | ||
|
|
e126ec9eea | ||
|
|
13a74ddbd2 | ||
|
|
b221ca1b52 | ||
|
|
05505279f8 | ||
|
|
61e66d3a11 | ||
|
|
3aa36ed129 | ||
|
|
90b9eee27e | ||
|
|
7d800d8932 | ||
|
|
913a754f20 | ||
|
|
73d32999e5 | ||
|
|
86034ca71f | ||
|
|
db91698c09 | ||
|
|
7f74114d31 | ||
|
|
53db634ec2 | ||
|
|
400f1f6289 | ||
|
|
596432f3f7 |
+40
-2
@@ -6,9 +6,46 @@ 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.
|
||||
|
||||
## Non distribué
|
||||
## `26.2.0-alpha.215`
|
||||
|
||||
Modules modifiés : **It's Alive `0.0.0-alpha.36`**, **Sanctuary `0.0.0-alpha.119`**, **Ambiance `0.0.0-alpha.15`**, **Only Fun `0.0.0-alpha.24`** et **Ouch `0.0.0-alpha.10`**. Le pack distribué reste en `26.2.0-alpha.210` jusqu’à la prochaine release.
|
||||
Module modifié : **Ambiance `0.0.0-alpha.18`**. Les neuf autres modules conservent leur version issue de l'alpha.214.
|
||||
|
||||
- corrige le crash natif déclenché par l’insertion ou l’arrêt du disque blanc en laissant Minecraft libérer le canal OpenAL sur son thread audio ;
|
||||
- rétablit le décodage audible du lien YouTube signalé grâce au profil iOS corrigé et à une révision épinglée de `youtube-source` ;
|
||||
- borne uniquement l’attente initiale du flux puis poursuit la lecture sans blocage, avec silence de compensation lorsque les données arrivent en retard ;
|
||||
- transforme les erreurs et blocages de lecture en arrêt propre accompagné d’un message au joueur ;
|
||||
- conserve les données Ambiance v2, le protocole réseau 6, les IDs et les sauvegardes existantes ;
|
||||
- distribue Ambiance `0.0.0-alpha.18` dans Packwiz et le `.mrpack` partagé client/serveur, sans exiger de nouveau monde ni réinitialiser les sauvegardes.
|
||||
|
||||
## `26.2.0-alpha.214`
|
||||
|
||||
Module modifié : **Ambiance `0.0.0-alpha.17`**. Les neuf autres modules conservent leur version issue de l'alpha.213.
|
||||
|
||||
- attend de façon bornée la synchronisation client du jukebox avant de charger un disque blanc, ce qui rétablit sa lecture en solo ;
|
||||
- affiche immédiatement le chargement puis un échec explicite si le jukebox n'est toujours pas synchronisé après cinq secondes ;
|
||||
- accepte toujours les liens de partage YouTube avec paramètres, notamment `https://youtu.be/Ue5ZBe-GzSM?si=…` ;
|
||||
- conserve les données Ambiance v2 et le protocole réseau 6, sans migration de sauvegarde ;
|
||||
- distribue Ambiance `0.0.0-alpha.17` dans Packwiz et le `.mrpack` partagé client/serveur, sans exiger de nouveau monde ni réinitialiser les sauvegardes.
|
||||
|
||||
## `26.2.0-alpha.213`
|
||||
|
||||
Module modifié : **Ambiance `0.0.0-alpha.16`**. Les neuf autres modules conservent leur version issue de l'alpha.212.
|
||||
|
||||
- corrige le crash client au démarrage d'Ambiance sous Minecraft 26.2 en ciblant le nouveau gestionnaire vanilla `LevelEventHandler` pour l'arrêt du disque blanc ;
|
||||
- conserve les données Ambiance v2 et le protocole réseau 6, sans migration de sauvegarde ;
|
||||
- remplace le JAR Ambiance cassé dans Packwiz et le `.mrpack` partagé client/serveur, sans exiger de nouveau monde ni réinitialiser les sauvegardes.
|
||||
|
||||
## `26.2.0-alpha.212`
|
||||
|
||||
Module modifié : **Sanctuary `0.0.0-alpha.120`**. Les neuf autres modules conservent leur version issue de l'alpha.211.
|
||||
|
||||
- corrige le crash client au démarrage provoqué par le mixin du clic molette du Black Market sous Minecraft 26.2 ;
|
||||
- cible désormais la méthode vanilla `pickBlockOrEntity`, sans modifier les données Sanctuary v11 ni le protocole réseau 22.
|
||||
- remplace le JAR Sanctuary cassé dans Packwiz et le `.mrpack` partagé client/serveur, sans exiger de nouveau monde ni réinitialiser les sauvegardes.
|
||||
|
||||
## `26.2.0-alpha.211`
|
||||
|
||||
Modules modifiés : **Ambiance `0.0.0-alpha.15`**, **It's Alive `0.0.0-alpha.36`**, **Only Fun `0.0.0-alpha.24`**, **Ouch `0.0.0-alpha.10`** et **Sanctuary `0.0.0-alpha.119`**. Les cinq autres modules conservent leur version issue de l’alpha.210.
|
||||
|
||||
- remplace les pages noires du Livre interdit par l’affichage clair du livre vanilla ;
|
||||
- conserve les seize entrées, les découvertes personnelles, le partage sur pupitre, les IDs, les données v3 et le protocole réseau 4.
|
||||
@@ -26,6 +63,7 @@ Modules modifiés : **It's Alive `0.0.0-alpha.36`**, **Sanctuary `0.0.0-alpha.11
|
||||
- ajoute la touche configurable « Chier » dans les contrôles Only Fun, assignée à `J` par défaut et sans répétition lorsque la touche reste maintenue ;
|
||||
- transmet une demande C2S vide, déduplique le spam d’un même tick et revalide côté serveur la connexion, la vie et le mode spectateur avant de réutiliser exactement l’action `/shit` ;
|
||||
- conserve les données Only Fun v2 et porte son protocole réseau de 2 à 3, sans nouveau cooldown, besoin ni donnée persistante.
|
||||
- distribue les cinq JAR mis à jour dans Packwiz et le `.mrpack` partagé client/serveur, sans exiger de nouveau monde ni réinitialiser les sauvegardes.
|
||||
|
||||
## `26.2.0-alpha.210`
|
||||
|
||||
|
||||
@@ -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.210`**. Cette release distribue le Livre interdit Canaplia avec It's Alive **`0.0.0-alpha.35`**, ainsi que Sanctuary **`0.0.0-alpha.118`**, Only Fun **`0.0.0-alpha.21`** et I Like To Move It **`0.0.0-alpha.15`**.
|
||||
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.
|
||||
|
||||
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.210 ajoute le Livre interdit, accélère le Happy Ghast piloté, regroupe les corrections du Shop, des requêtes, des capes et des noms de Zombies, puis actualise JEI en **`30.28.0.193`**. Elle met à jour les packs Modrinth, Prism et Packwiz sans exiger de nouveau monde ni réinitialiser les sauvegardes.
|
||||
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.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.
|
||||
|
||||
|
||||
@@ -24,8 +24,10 @@ Ambiance conserve ses données v2 ; son protocole passe de 5 à 6.
|
||||
|
||||
## Dépendances clientes embarquées
|
||||
|
||||
Le décodage repose sur Lavaplayer `2.2.7` (Apache-2.0) et youtube-source `1.18.2` (MIT), ainsi que
|
||||
leurs dépendances transitives placées en JAR imbriqués par Loom. Leurs avis de licence restent dans
|
||||
les archives d’origine. L’accès YouTube est effectué uniquement par le client et peut cesser de
|
||||
fonctionner si YouTube modifie ses mécanismes de lecture ; aucune clé ou URL arbitraire n’est
|
||||
acceptée par le serveur.
|
||||
Le décodage repose sur Lavaplayer `2.2.7` (Apache-2.0) et sur le commit youtube-source
|
||||
`f45bbb7aebfcbc1c553769e04af6cd43afa8b7c3` (MIT), épinglé pour intégrer les correctifs de lecture
|
||||
YouTube publiés après `1.18.2`. Le profil iOS corrigé est utilisé sans compte, OAuth, jeton privé ou
|
||||
service de chiffrement tiers. Les dépendances sont placées en JAR imbriqués par Loom et leurs avis
|
||||
de licence restent dans les archives d’origine. L’accès YouTube est effectué uniquement par le
|
||||
client et peut cesser de fonctionner si YouTube modifie ses mécanismes de lecture ; aucune clé ou
|
||||
URL arbitraire n’est acceptée par le serveur.
|
||||
|
||||
+40
-7
@@ -1,5 +1,7 @@
|
||||
import groovy.json.JsonSlurper
|
||||
|
||||
def youtubeSourceVersion = "f45bbb7aebfcbc1c553769e04af6cd43afa8b7c3-SNAPSHOT"
|
||||
|
||||
configurations {
|
||||
whiteDiscLibraries
|
||||
implementation.extendsFrom whiteDiscLibraries
|
||||
@@ -13,14 +15,14 @@ dependencies {
|
||||
exclude group: "org.slf4j", module: "slf4j-api"
|
||||
exclude group: "org.jetbrains", module: "annotations"
|
||||
}
|
||||
whiteDiscLibraries("dev.lavalink.youtube:v2:1.18.2") {
|
||||
whiteDiscLibraries("dev.lavalink.youtube:v2:${youtubeSourceVersion}") {
|
||||
exclude group: "org.slf4j", module: "slf4j-api"
|
||||
exclude group: "org.jetbrains", module: "annotations"
|
||||
}
|
||||
[
|
||||
"dev.arbjerg:lavaplayer-natives:2.2.7",
|
||||
"dev.arbjerg:lava-common:2.2.7",
|
||||
"dev.lavalink.youtube:common:1.18.2",
|
||||
"dev.lavalink.youtube:common:${youtubeSourceVersion}",
|
||||
"org.mozilla:rhino-engine:1.7.15",
|
||||
"org.mozilla:rhino:1.7.15",
|
||||
"commons-io:commons-io:2.13.0",
|
||||
@@ -64,15 +66,24 @@ tasks.register("whiteDiscUrlSmoke", JavaExec) {
|
||||
mainClass = "fr.koka99cab.sanctuary26.ambiance.white_disc.WhiteDiscUrlSmoke"
|
||||
}
|
||||
|
||||
tasks.register("whiteDiscPlaybackSmoke", JavaExec) {
|
||||
group = "verification"
|
||||
description = "Manually checks live YouTube loading and PCM decoding for the white disc."
|
||||
dependsOn tasks.named("testClasses")
|
||||
classpath = sourceSets.test.runtimeClasspath
|
||||
mainClass = "fr.koka99cab.sanctuary26.ambiance.client.audio.WhiteDiscPlaybackSmoke"
|
||||
}
|
||||
|
||||
tasks.named("test") {
|
||||
failOnNoDiscoveredTests = false
|
||||
}
|
||||
|
||||
tasks.register("verifyAmbiance") {
|
||||
group = "verification"
|
||||
description = "Checks Ambiance alpha.15, including the bounded YouTube white-disc playback contract."
|
||||
description = "Checks Ambiance alpha.18, including resilient white-disc YouTube 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(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"))
|
||||
@@ -120,8 +131,14 @@ tasks.register("verifyAmbiance") {
|
||||
file("src/main/resources/data/ambiance/recipe/white_disc.json"))
|
||||
def whiteDiscSong = new JsonSlurper().parse(
|
||||
file("src/main/resources/data/ambiance/jukebox_song/white_disc.json"))
|
||||
def levelEventMixin = file(
|
||||
"src/main/java/fr/koka99cab/sanctuary26/ambiance/mixin/client/LevelEventHandlerMixin.java").text
|
||||
def whiteDiscAudioPlayer = file(
|
||||
"src/main/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscAudioPlayer.java").text
|
||||
def whiteDiscPlaybackSmoke = file(
|
||||
"src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscPlaybackSmoke.java").text
|
||||
|
||||
if (project.version.toString() != "0.0.0-alpha.15"
|
||||
if (project.version.toString() != "0.0.0-alpha.18"
|
||||
|| 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"
|
||||
@@ -319,10 +336,21 @@ tasks.register("verifyAmbiance") {
|
||||
|| !javaText.contains('PlayerLookup.tracking(level, pos)')
|
||||
|| !javaText.contains('ServerPlayNetworking.canSend(receiver, WhiteDiscPlaybackPayload.ID)')
|
||||
|| !javaText.contains('MAXIMUM_SIMULTANEOUS_DISCS = 4')
|
||||
|| !javaText.contains('REQUESTS.size() + PLAYBACKS.size() >= MAXIMUM_SIMULTANEOUS_DISCS')
|
||||
|| !javaText.contains('PENDING_STARTS.size() + REQUESTS.size() + PLAYBACKS.size()')
|
||||
|| !javaText.contains('MAXIMUM_START_WAIT_TICKS = 100')
|
||||
|| !javaText.contains('tickPendingStarts(client)')
|
||||
|| !javaText.contains('client.level.dimension().equals(playback.dimension())')
|
||||
|| !javaText.contains('MAXIMUM_TRACK_MILLIS = 30L * 60L * 1_000L')
|
||||
|| !javaText.contains('new Pcm16AudioDataFormat(1, LavaplayerAudioStream.SAMPLE_RATE')
|
||||
|| !javaText.contains('new YoutubeAudioSourceManager(false, new Ios())')
|
||||
|| !javaText.contains('player.addListener(new AudioEventAdapter()')
|
||||
|| !javaText.contains('failPlayback(client, key, failedPlayer)')
|
||||
|| !javaText.contains('initialWaitAttempted')
|
||||
|| !javaText.contains('frame = player.provide()')
|
||||
|| !whiteDiscAudioPlayer.contains('handle.execute(channel -> channel.stop())')
|
||||
|| whiteDiscAudioPlayer.contains('.release()')
|
||||
|| !whiteDiscPlaybackSmoke.contains('https://www.youtube.com/watch?v=Ue5ZBe-GzSM')
|
||||
|| !whiteDiscPlaybackSmoke.contains('Decoded audible PCM data')
|
||||
|| !javaText.contains('SoundSource.RECORDS')
|
||||
|| !javaText.contains('channel.linearAttenuation(ATTENUATION_DISTANCE)')
|
||||
|| !javaText.contains('LONG_HOSTS = Set.of(')
|
||||
@@ -334,6 +362,9 @@ tasks.register("verifyAmbiance") {
|
||||
|| whiteDiscRecipe.key?.W != "minecraft:white_dye"
|
||||
|| whiteDiscSong.sound_event != "minecraft:intentionally_empty"
|
||||
|| whiteDiscSong.length_in_seconds != 1800
|
||||
|| !levelEventMixin.contains('@Mixin(LevelEventHandler.class)')
|
||||
|| !levelEventMixin.contains('@Inject(method = "levelEvent"')
|
||||
|| !levelEventMixin.contains('ambiance$stopWhiteDisc(int type, BlockPos pos, int data,')
|
||||
|| ambianceLanguages.any { locale, translations ->
|
||||
!["item.ambiance.white_disc", "tooltip.ambiance.white_disc",
|
||||
"message.ambiance.white_disc.invalid_url", "message.ambiance.white_disc.failed"].every {
|
||||
@@ -341,8 +372,10 @@ tasks.register("verifyAmbiance") {
|
||||
}
|
||||
}
|
||||
|| !file("build.gradle").text.contains('dev.arbjerg:lavaplayer:2.2.7')
|
||||
|| !file("build.gradle").text.contains('dev.lavalink.youtube:v2:1.18.2')) {
|
||||
throw new GradleException("Ambiance alpha.15 white-disc playback contract is incomplete")
|
||||
|| !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")
|
||||
}
|
||||
|
||||
[
|
||||
|
||||
+14
-6
@@ -12,13 +12,12 @@ 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 int FRAME_SAMPLES = 960;
|
||||
private static final int BYTES_PER_SAMPLE = 2;
|
||||
private static final AudioFormat FORMAT =
|
||||
new AudioFormat(SAMPLE_RATE, 16, 1, true, false);
|
||||
private final AudioPlayer player;
|
||||
private byte[] pending = new byte[0];
|
||||
private int pendingOffset;
|
||||
private boolean initialWaitAttempted;
|
||||
private volatile boolean closed;
|
||||
private volatile boolean ended;
|
||||
|
||||
@@ -45,9 +44,8 @@ final class LavaplayerAudioStream implements AudioStream {
|
||||
AudioFrame frame = nextFrame();
|
||||
if (frame == null) {
|
||||
if (ended) break;
|
||||
int silence = Math.min(output.remaining(), FRAME_SAMPLES * BYTES_PER_SAMPLE);
|
||||
for (int index = 0; index < silence; index++) output.put((byte) 0);
|
||||
continue;
|
||||
while (output.hasRemaining()) output.put((byte) 0);
|
||||
break;
|
||||
}
|
||||
if (frame.isTerminator()) {
|
||||
ended = true;
|
||||
@@ -63,7 +61,13 @@ final class LavaplayerAudioStream implements AudioStream {
|
||||
|
||||
private AudioFrame nextFrame() throws IOException {
|
||||
try {
|
||||
AudioFrame frame = player.provide(2, TimeUnit.SECONDS);
|
||||
AudioFrame frame;
|
||||
if (!initialWaitAttempted) {
|
||||
initialWaitAttempted = true;
|
||||
frame = player.provide(2, TimeUnit.SECONDS);
|
||||
} else {
|
||||
frame = player.provide();
|
||||
}
|
||||
if (frame == null && player.getPlayingTrack() == null) ended = true;
|
||||
return frame;
|
||||
} catch (TimeoutException ignored) {
|
||||
@@ -78,6 +82,10 @@ final class LavaplayerAudioStream implements AudioStream {
|
||||
return ended;
|
||||
}
|
||||
|
||||
boolean uses(AudioPlayer expectedPlayer) {
|
||||
return player == expectedPlayer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
if (closed) return;
|
||||
|
||||
+102
-17
@@ -5,10 +5,12 @@ import com.sedmelluq.discord.lavaplayer.format.Pcm16AudioDataFormat;
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
|
||||
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
|
||||
import com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter;
|
||||
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
||||
import dev.lavalink.youtube.YoutubeAudioSourceManager;
|
||||
import dev.lavalink.youtube.clients.Ios;
|
||||
import fr.koka99cab.sanctuary26.ambiance.AmbianceMod;
|
||||
import fr.koka99cab.sanctuary26.ambiance.mixin.client.SoundEngineAccessor;
|
||||
import fr.koka99cab.sanctuary26.ambiance.mixin.client.SoundManagerAccessor;
|
||||
@@ -30,10 +32,12 @@ import net.minecraft.world.phys.Vec3;
|
||||
/** Client-only, positional and resource-bounded YouTube playback for white discs. */
|
||||
public final class WhiteDiscAudioPlayer {
|
||||
private static final int MAXIMUM_SIMULTANEOUS_DISCS = 4;
|
||||
private static final int MAXIMUM_START_WAIT_TICKS = 100;
|
||||
private static final long MAXIMUM_TRACK_MILLIS = 30L * 60L * 1_000L;
|
||||
private static final long FINISHED_GRACE_NANOS = 5_000_000_000L;
|
||||
private static final float ATTENUATION_DISTANCE = 64.0F;
|
||||
private static final DefaultAudioPlayerManager MANAGER = createManager();
|
||||
private static final Map<Long, PendingStart> PENDING_STARTS = new HashMap<>();
|
||||
private static final Map<Long, Long> REQUESTS = new HashMap<>();
|
||||
private static final LinkedHashMap<Long, Playback> PLAYBACKS = new LinkedHashMap<>();
|
||||
private static long requestSequence;
|
||||
@@ -43,16 +47,27 @@ public final class WhiteDiscAudioPlayer {
|
||||
}
|
||||
|
||||
public static void play(Minecraft client, BlockPos pos, String videoId) {
|
||||
if (shutdown || !WhiteDiscUrl.validVideoId(videoId) || !validTarget(client, pos)) return;
|
||||
if (shutdown || !WhiteDiscUrl.validVideoId(videoId) || !validJukeboxTarget(client, pos)) return;
|
||||
long key = pos.asLong();
|
||||
if (REQUESTS.containsKey(key)) return;
|
||||
if (PENDING_STARTS.containsKey(key) || REQUESTS.containsKey(key)) return;
|
||||
boolean replacingPlayback = PLAYBACKS.containsKey(key);
|
||||
if (!replacingPlayback
|
||||
&& REQUESTS.size() + PLAYBACKS.size() >= MAXIMUM_SIMULTANEOUS_DISCS) return;
|
||||
&& PENDING_STARTS.size() + REQUESTS.size() + PLAYBACKS.size()
|
||||
>= MAXIMUM_SIMULTANEOUS_DISCS) return;
|
||||
stop(key);
|
||||
client.player.sendOverlayMessage(Component.translatable("message.ambiance.white_disc.loading"));
|
||||
if (!validTarget(client, pos)) {
|
||||
PENDING_STARTS.put(key, new PendingStart(pos.immutable(), client.level.dimension(), videoId,
|
||||
MAXIMUM_START_WAIT_TICKS));
|
||||
return;
|
||||
}
|
||||
startLoading(client, pos, videoId);
|
||||
}
|
||||
|
||||
private static void startLoading(Minecraft client, BlockPos pos, String videoId) {
|
||||
long key = pos.asLong();
|
||||
long request = ++requestSequence;
|
||||
REQUESTS.put(key, request);
|
||||
client.player.sendOverlayMessage(Component.translatable("message.ambiance.white_disc.loading"));
|
||||
MANAGER.loadItemOrdered(key, WhiteDiscUrl.canonicalUrl(videoId), new AudioLoadResultHandler() {
|
||||
@Override
|
||||
public void trackLoaded(AudioTrack track) {
|
||||
@@ -101,24 +116,49 @@ public final class WhiteDiscAudioPlayer {
|
||||
ChannelAccess channels = ((SoundEngineAccessor) ((SoundManagerAccessor) client.getSoundManager())
|
||||
.ambiance$getSoundEngine()).ambiance$getChannelAccess();
|
||||
channels.createHandle(Library.Pool.STREAMING).thenAccept(handle -> client.execute(() -> {
|
||||
if (handle == null || REQUESTS.getOrDefault(key, -1L) != request) {
|
||||
if (handle != null) handle.release();
|
||||
if (handle == null || REQUESTS.getOrDefault(key, -1L) != request
|
||||
|| !validTarget(client, pos)) {
|
||||
if (handle != null) handle.execute(channel -> channel.stop());
|
||||
if (REQUESTS.getOrDefault(key, -1L) == request) REQUESTS.remove(key);
|
||||
return;
|
||||
}
|
||||
AudioPlayer player = MANAGER.createPlayer();
|
||||
player.playTrack(track);
|
||||
LavaplayerAudioStream stream = new LavaplayerAudioStream(player);
|
||||
Playback playback = new Playback(pos.immutable(), client.level.dimension(), handle, stream);
|
||||
PLAYBACKS.put(key, playback);
|
||||
REQUESTS.remove(key);
|
||||
player.addListener(new AudioEventAdapter() {
|
||||
@Override
|
||||
public void onTrackException(AudioPlayer failedPlayer, AudioTrack failedTrack,
|
||||
FriendlyException exception) {
|
||||
AmbianceMod.LOGGER.warn("White-disc playback failed for YouTube video {}: {}",
|
||||
failedTrack.getIdentifier(), exception.getMessage());
|
||||
client.execute(() -> failPlayback(client, key, failedPlayer));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTrackStuck(AudioPlayer stuckPlayer, AudioTrack stuckTrack,
|
||||
long thresholdMs) {
|
||||
AmbianceMod.LOGGER.warn("White-disc playback stalled for YouTube video {} after {} ms",
|
||||
stuckTrack.getIdentifier(), thresholdMs);
|
||||
client.execute(() -> failPlayback(client, key, stuckPlayer));
|
||||
}
|
||||
});
|
||||
player.playTrack(track);
|
||||
float volume = client.options.getFinalSoundSourceVolume(SoundSource.RECORDS);
|
||||
handle.execute(channel -> {
|
||||
channel.setSelfPosition(Vec3.atCenterOf(pos));
|
||||
channel.setRelative(false);
|
||||
channel.linearAttenuation(ATTENUATION_DISTANCE);
|
||||
channel.setVolume(volume);
|
||||
channel.attachBufferStream(stream);
|
||||
channel.play();
|
||||
try {
|
||||
channel.setSelfPosition(Vec3.atCenterOf(pos));
|
||||
channel.setRelative(false);
|
||||
channel.linearAttenuation(ATTENUATION_DISTANCE);
|
||||
channel.setVolume(volume);
|
||||
channel.attachBufferStream(stream);
|
||||
channel.play();
|
||||
} catch (RuntimeException | LinkageError exception) {
|
||||
AmbianceMod.LOGGER.error("Unable to attach white-disc audio to Minecraft's sound engine",
|
||||
exception);
|
||||
client.execute(() -> failPlayback(client, key, player));
|
||||
}
|
||||
});
|
||||
if (client.player != null) client.player.sendOverlayMessage(
|
||||
Component.translatable("message.ambiance.white_disc.playing", track.getInfo().title));
|
||||
@@ -132,17 +172,25 @@ public final class WhiteDiscAudioPlayer {
|
||||
Component.translatable("message.ambiance.white_disc.failed"));
|
||||
}
|
||||
|
||||
private static void failPlayback(Minecraft client, long key, AudioPlayer player) {
|
||||
Playback playback = PLAYBACKS.get(key);
|
||||
if (playback == null || !playback.stream().uses(player)) return;
|
||||
stop(key);
|
||||
if (client.player != null) client.player.sendOverlayMessage(
|
||||
Component.translatable("message.ambiance.white_disc.failed"));
|
||||
}
|
||||
|
||||
public static void stop(BlockPos pos) {
|
||||
stop(pos.asLong());
|
||||
}
|
||||
|
||||
private static void stop(long key) {
|
||||
PENDING_STARTS.remove(key);
|
||||
REQUESTS.remove(key);
|
||||
Playback playback = PLAYBACKS.remove(key);
|
||||
if (playback == null) return;
|
||||
playback.stream().close();
|
||||
playback.handle().execute(channel -> channel.stop());
|
||||
playback.handle().release();
|
||||
}
|
||||
|
||||
public static void tick(Minecraft client) {
|
||||
@@ -150,6 +198,7 @@ public final class WhiteDiscAudioPlayer {
|
||||
clear();
|
||||
return;
|
||||
}
|
||||
tickPendingStarts(client);
|
||||
long now = System.nanoTime();
|
||||
for (Map.Entry<Long, Playback> entry : Map.copyOf(PLAYBACKS).entrySet()) {
|
||||
Playback playback = entry.getValue();
|
||||
@@ -167,6 +216,7 @@ public final class WhiteDiscAudioPlayer {
|
||||
}
|
||||
|
||||
public static void clear() {
|
||||
PENDING_STARTS.clear();
|
||||
REQUESTS.clear();
|
||||
for (long key : PLAYBACKS.keySet().stream().mapToLong(Long::longValue).toArray()) stop(key);
|
||||
}
|
||||
@@ -184,16 +234,51 @@ public final class WhiteDiscAudioPlayer {
|
||||
new Pcm16AudioDataFormat(1, LavaplayerAudioStream.SAMPLE_RATE, 960, false));
|
||||
manager.setFrameBufferDuration(5_000);
|
||||
manager.setItemLoaderThreadPoolSize(2);
|
||||
manager.registerSourceManager(new YoutubeAudioSourceManager(false));
|
||||
manager.registerSourceManager(new YoutubeAudioSourceManager(false, new Ios()));
|
||||
return manager;
|
||||
}
|
||||
|
||||
private static boolean validTarget(Minecraft client, BlockPos pos) {
|
||||
return validJukeboxTarget(client, pos)
|
||||
&& client.level.getBlockState(pos).getValue(JukeboxBlock.HAS_RECORD);
|
||||
}
|
||||
|
||||
private static boolean validJukeboxTarget(Minecraft client, BlockPos pos) {
|
||||
return client.player != null && client.level != null
|
||||
&& client.player.distanceToSqr(Vec3.atCenterOf(pos))
|
||||
<= ATTENUATION_DISTANCE * ATTENUATION_DISTANCE * 4.0D
|
||||
&& client.level.getBlockState(pos).is(Blocks.JUKEBOX)
|
||||
&& client.level.getBlockState(pos).getValue(JukeboxBlock.HAS_RECORD);
|
||||
&& client.level.getBlockState(pos).is(Blocks.JUKEBOX);
|
||||
}
|
||||
|
||||
private static void tickPendingStarts(Minecraft client) {
|
||||
for (Map.Entry<Long, PendingStart> entry : Map.copyOf(PENDING_STARTS).entrySet()) {
|
||||
long key = entry.getKey();
|
||||
PendingStart pending = entry.getValue();
|
||||
if (!client.level.dimension().equals(pending.dimension())
|
||||
|| !validJukeboxTarget(client, pending.pos())) {
|
||||
PENDING_STARTS.remove(key);
|
||||
continue;
|
||||
}
|
||||
if (validTarget(client, pending.pos())) {
|
||||
PENDING_STARTS.remove(key);
|
||||
startLoading(client, pending.pos(), pending.videoId());
|
||||
continue;
|
||||
}
|
||||
if (pending.ticksRemaining() <= 1) {
|
||||
PENDING_STARTS.remove(key);
|
||||
if (client.player != null) client.player.sendOverlayMessage(
|
||||
Component.translatable("message.ambiance.white_disc.failed"));
|
||||
continue;
|
||||
}
|
||||
PENDING_STARTS.put(key, pending.waitOneTick());
|
||||
}
|
||||
}
|
||||
|
||||
private record PendingStart(BlockPos pos, ResourceKey<Level> dimension, String videoId,
|
||||
int ticksRemaining) {
|
||||
private PendingStart waitOneTick() {
|
||||
return new PendingStart(pos, dimension, videoId, ticksRemaining - 1);
|
||||
}
|
||||
}
|
||||
|
||||
private record Playback(BlockPos pos, ResourceKey<Level> dimension,
|
||||
|
||||
+4
-6
@@ -1,19 +1,17 @@
|
||||
package fr.koka99cab.sanctuary26.ambiance.mixin.client;
|
||||
|
||||
import fr.koka99cab.sanctuary26.ambiance.client.audio.WhiteDiscAudioPlayer;
|
||||
import net.minecraft.client.renderer.LevelRenderer;
|
||||
import net.minecraft.client.renderer.LevelEventHandler;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
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.CallbackInfo;
|
||||
|
||||
@Mixin(LevelRenderer.class)
|
||||
public abstract class LevelRendererMixin {
|
||||
@Mixin(LevelEventHandler.class)
|
||||
public abstract class LevelEventHandlerMixin {
|
||||
@Inject(method = "levelEvent", at = @At("HEAD"))
|
||||
private void ambiance$stopWhiteDisc(Entity source, int type, BlockPos pos, int data,
|
||||
CallbackInfo callback) {
|
||||
private void ambiance$stopWhiteDisc(int type, BlockPos pos, int data, CallbackInfo callback) {
|
||||
if (type == 1011) WhiteDiscAudioPlayer.stop(pos);
|
||||
}
|
||||
}
|
||||
@@ -11,7 +11,7 @@
|
||||
"GameRendererMixin",
|
||||
"LightCoordsUtilMixin",
|
||||
"LightmapRenderStateExtractorMixin",
|
||||
"LevelRendererMixin",
|
||||
"LevelEventHandlerMixin",
|
||||
"SoundEngineAccessor",
|
||||
"SoundManagerAccessor",
|
||||
"SkyRendererMixin"
|
||||
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
package fr.koka99cab.sanctuary26.ambiance.client.audio;
|
||||
|
||||
import com.sedmelluq.discord.lavaplayer.format.Pcm16AudioDataFormat;
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
|
||||
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
|
||||
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
||||
import dev.lavalink.youtube.YoutubeAudioSourceManager;
|
||||
import dev.lavalink.youtube.clients.Ios;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/** Manual network smoke test for the exact YouTube playback path used by white discs. */
|
||||
public final class WhiteDiscPlaybackSmoke {
|
||||
private static final String VIDEO_URL = "https://www.youtube.com/watch?v=Ue5ZBe-GzSM";
|
||||
|
||||
private WhiteDiscPlaybackSmoke() {
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
DefaultAudioPlayerManager manager = new DefaultAudioPlayerManager();
|
||||
manager.getConfiguration().setOutputFormat(
|
||||
new Pcm16AudioDataFormat(1, LavaplayerAudioStream.SAMPLE_RATE, 960, false));
|
||||
manager.registerSourceManager(new YoutubeAudioSourceManager(false, new Ios()));
|
||||
try {
|
||||
AudioTrack track = load(manager).get(30, TimeUnit.SECONDS);
|
||||
AudioPlayer player = manager.createPlayer();
|
||||
player.playTrack(track);
|
||||
LavaplayerAudioStream stream = new LavaplayerAudioStream(player);
|
||||
int decodedBytes = 0;
|
||||
for (int index = 0; index < 4; index++) {
|
||||
ByteBuffer pcm = stream.read(LavaplayerAudioStream.SAMPLE_RATE * 2);
|
||||
if (pcm == null) break;
|
||||
while (pcm.hasRemaining()) {
|
||||
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);
|
||||
stream.close();
|
||||
} finally {
|
||||
manager.shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
private static CompletableFuture<AudioTrack> load(DefaultAudioPlayerManager manager) {
|
||||
CompletableFuture<AudioTrack> result = new CompletableFuture<>();
|
||||
manager.loadItem(VIDEO_URL, new AudioLoadResultHandler() {
|
||||
@Override
|
||||
public void trackLoaded(AudioTrack track) {
|
||||
result.complete(track);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void playlistLoaded(AudioPlaylist playlist) {
|
||||
AudioTrack selected = playlist.getSelectedTrack();
|
||||
if (selected == null && !playlist.getTracks().isEmpty()) {
|
||||
selected = playlist.getTracks().getFirst();
|
||||
}
|
||||
if (selected == null) result.completeExceptionally(
|
||||
new IllegalStateException("YouTube playlist contained no track"));
|
||||
else result.complete(selected);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void noMatches() {
|
||||
result.completeExceptionally(new IllegalStateException("YouTube returned no match"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadFailed(FriendlyException exception) {
|
||||
result.completeExceptionally(exception);
|
||||
}
|
||||
});
|
||||
return result;
|
||||
}
|
||||
}
|
||||
+2
@@ -10,6 +10,8 @@ public final class WhiteDiscUrlSmoke {
|
||||
public static void main(String[] args) {
|
||||
require(VIDEO_ID.equals(id("https://www.youtube.com/watch?v=" + VIDEO_ID)), "watch URL rejected");
|
||||
require(VIDEO_ID.equals(id("https://youtu.be/" + VIDEO_ID + "?si=abc")), "short URL rejected");
|
||||
require("Ue5ZBe-GzSM".equals(id("https://youtu.be/Ue5ZBe-GzSM?si=78LSbtBQzUYzhA2Y")),
|
||||
"reported white-disc URL rejected");
|
||||
require(VIDEO_ID.equals(id("https://music.youtube.com/watch?v=" + VIDEO_ID)), "music URL rejected");
|
||||
require(VIDEO_ID.equals(id("https://www.youtube.com/shorts/" + VIDEO_ID)), "shorts URL rejected");
|
||||
require(VIDEO_ID.equals(id("https://www.youtube.com/embed/" + VIDEO_ID)), "embed URL rejected");
|
||||
|
||||
+508
-92
@@ -36,8 +36,8 @@ allprojects {
|
||||
exclusiveContent {
|
||||
forRepository {
|
||||
maven {
|
||||
name = "Lavalink"
|
||||
url = "https://maven.lavalink.dev/releases"
|
||||
name = "LavalinkSnapshots"
|
||||
url = "https://maven.lavalink.dev/snapshots"
|
||||
}
|
||||
}
|
||||
filter { includeGroup "dev.lavalink.youtube" }
|
||||
@@ -3437,8 +3437,8 @@ 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.210"
|
||||
|| rootProject.sanctuary_version != "0.0.0-alpha.119"
|
||||
if (rootProject.pack_version != "26.2.0-alpha.215"
|
||||
|| 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
|
||||
|| migration.source?.modules != [sanctuary: "0.0.0-alpha.108", onlyfun: "0.0.0-alpha.17"]
|
||||
@@ -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.210"
|
||||
if (rootProject.pack_version != "26.2.0-alpha.215"
|
||||
|| 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,9 +4206,9 @@ 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.210"
|
||||
if (rootProject.pack_version != "26.2.0-alpha.215"
|
||||
|| rootProject.onlyfun_version != "0.0.0-alpha.24"
|
||||
|| rootProject.sanctuary_version != "0.0.0-alpha.119"
|
||||
|| rootProject.sanctuary_version != "0.0.0-alpha.120"
|
||||
|| release.pack_version != rootProject.pack_version || index.versionId != rootProject.pack_version
|
||||
|| migration.source?.pack_version != "26.2.0-alpha.192"
|
||||
|| migration.target?.pack_version != "26.2.0-alpha.193"
|
||||
@@ -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.210"
|
||||
if (rootProject.pack_version != "26.2.0-alpha.215"
|
||||
|| 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,9 +4300,9 @@ 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.210"
|
||||
if (rootProject.pack_version != "26.2.0-alpha.215"
|
||||
|| rootProject.onlyfun_version != "0.0.0-alpha.24"
|
||||
|| rootProject.sanctuary_version != "0.0.0-alpha.119"
|
||||
|| rootProject.sanctuary_version != "0.0.0-alpha.120"
|
||||
|| release.pack_version != rootProject.pack_version || index.versionId != rootProject.pack_version
|
||||
|| migration.source?.pack_version != "26.2.0-alpha.194"
|
||||
|| migration.source?.modules != [onlyfun: "0.0.0-alpha.18", sanctuary: "0.0.0-alpha.110"]
|
||||
@@ -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.210"
|
||||
if (rootProject.pack_version != "26.2.0-alpha.215"
|
||||
|| 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.210"
|
||||
|| release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.210.mrpack"
|
||||
|| prism.versionId != "26.2.0-alpha.210"
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.210"')) {
|
||||
|| 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"')) {
|
||||
throw new GradleException("The alpha.196 culinary, mailbox and grapple release contract is incomplete")
|
||||
}
|
||||
}
|
||||
@@ -4392,9 +4392,9 @@ 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.210"
|
||||
if (rootProject.pack_version != "26.2.0-alpha.215"
|
||||
|| rootProject.itsalive_version != "0.0.0-alpha.36"
|
||||
|| rootProject.sanctuary_version != "0.0.0-alpha.119"
|
||||
|| rootProject.sanctuary_version != "0.0.0-alpha.120"
|
||||
|| migration.source?.pack_version != "26.2.0-alpha.196"
|
||||
|| migration.target?.pack_version != "26.2.0-alpha.197"
|
||||
|| migration.target?.modules != [itsalive: "0.0.0-alpha.29", sanctuary: "0.0.0-alpha.113"]
|
||||
@@ -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.210"
|
||||
|| release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.210.mrpack"
|
||||
|| prism.versionId != "26.2.0-alpha.210"
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.210"')) {
|
||||
|| 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"')) {
|
||||
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.210"
|
||||
if (rootProject.pack_version != "26.2.0-alpha.215"
|
||||
|| 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,11 +4461,11 @@ 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.210"
|
||||
|| release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.210.mrpack"
|
||||
|| prism.versionId != "26.2.0-alpha.210"
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.210"')
|
||||
|| !packwizIndex.contains('file = "mods/itsalive-0.0.0-alpha.35.jar"')) {
|
||||
|| 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/itsalive-0.0.0-alpha.36.jar"')) {
|
||||
throw new GradleException("The alpha.198 fermentation barrel release contract is incomplete")
|
||||
}
|
||||
}
|
||||
@@ -4492,9 +4492,9 @@ 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.210"
|
||||
if (rootProject.pack_version != "26.2.0-alpha.215"
|
||||
|| rootProject.itsalive_version != "0.0.0-alpha.36"
|
||||
|| rootProject.sanctuary_version != "0.0.0-alpha.119"
|
||||
|| rootProject.sanctuary_version != "0.0.0-alpha.120"
|
||||
|| migration.source?.pack_version != "26.2.0-alpha.198"
|
||||
|| migration.source?.modules?.sanctuary != "0.0.0-alpha.114"
|
||||
|| migration.target?.pack_version != "26.2.0-alpha.199"
|
||||
@@ -4506,12 +4506,12 @@ 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.210"
|
||||
|| release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.210.mrpack"
|
||||
|| prism.versionId != "26.2.0-alpha.210"
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.210"')
|
||||
|| !packwizIndex.contains('file = "mods/itsalive-0.0.0-alpha.35.jar"')
|
||||
|| !packwizIndex.contains('file = "mods/sanctuary-0.0.0-alpha.118.jar"')) {
|
||||
|| 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/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.210"
|
||||
|| rootProject.ambiance_version != "0.0.0-alpha.15"
|
||||
if (rootProject.pack_version != "26.2.0-alpha.215"
|
||||
|| rootProject.ambiance_version != "0.0.0-alpha.18"
|
||||
|| 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,12 +4581,12 @@ tasks.register("verifyWeatherTntAmbianceRelease") {
|
||||
|| !weatherTnt.contains("AmbianceDailyWeather.CLEAR")
|
||||
|| !weatherTnt.contains("CLEAR_WEATHER_TICKS = 864_000")
|
||||
|| weatherTnt.contains("setWeatherParameters")
|
||||
|| release.pack_version != "26.2.0-alpha.210"
|
||||
|| release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.210.mrpack"
|
||||
|| prism.versionId != "26.2.0-alpha.210"
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.210"')
|
||||
|| !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.14.jar"')
|
||||
|| !packwizIndex.contains('file = "mods/ouch-0.0.0-alpha.9.jar"')) {
|
||||
|| 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"')
|
||||
|| !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,8 +4613,8 @@ 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.210"
|
||||
|| rootProject.sanctuary_version != "0.0.0-alpha.119"
|
||||
if (rootProject.pack_version != "26.2.0-alpha.215"
|
||||
|| 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"
|
||||
|| migration.target?.pack_version != "26.2.0-alpha.201"
|
||||
@@ -4628,11 +4628,11 @@ 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.210"
|
||||
|| release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.210.mrpack"
|
||||
|| prism.versionId != "26.2.0-alpha.210"
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.210"')
|
||||
|| !packwizIndex.contains('file = "mods/sanctuary-0.0.0-alpha.118.jar"')) {
|
||||
|| 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/sanctuary-0.0.0-alpha.120.jar"')) {
|
||||
throw new GradleException("The alpha.201 quest-request escrow release is incomplete")
|
||||
}
|
||||
}
|
||||
@@ -4667,11 +4667,11 @@ 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.210"
|
||||
if (rootProject.pack_version != "26.2.0-alpha.215"
|
||||
|| rootProject.anotherworld_version != "0.0.0-alpha.55"
|
||||
|| rootProject.itsalive_version != "0.0.0-alpha.36"
|
||||
|| rootProject.iliketomoveit_version != "0.0.0-alpha.15"
|
||||
|| rootProject.sanctuary_version != "0.0.0-alpha.119"
|
||||
|| rootProject.sanctuary_version != "0.0.0-alpha.120"
|
||||
|| migration.source?.pack_version != "26.2.0-alpha.201"
|
||||
|| migration.source?.modules != [
|
||||
itsalive: "0.0.0-alpha.30",
|
||||
@@ -4707,14 +4707,14 @@ 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.210"
|
||||
|| release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.210.mrpack"
|
||||
|| prism.versionId != "26.2.0-alpha.210"
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.210"')
|
||||
|| 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/anotherworld-0.0.0-alpha.55.jar"')
|
||||
|| !packwizIndex.contains('file = "mods/itsalive-0.0.0-alpha.35.jar"')
|
||||
|| !packwizIndex.contains('file = "mods/itsalive-0.0.0-alpha.36.jar"')
|
||||
|| !packwizIndex.contains('file = "mods/iliketomoveit-0.0.0-alpha.15.jar"')
|
||||
|| !packwizIndex.contains('file = "mods/sanctuary-0.0.0-alpha.118.jar"')) {
|
||||
|| !packwizIndex.contains('file = "mods/sanctuary-0.0.0-alpha.120.jar"')) {
|
||||
throw new GradleException("The alpha.202 Waystone, Shop and culinary lectern release is incomplete")
|
||||
}
|
||||
}
|
||||
@@ -4827,9 +4827,9 @@ 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.210"
|
||||
if (rootProject.pack_version != "26.2.0-alpha.215"
|
||||
|| rootProject.anotherworld_version != "0.0.0-alpha.55"
|
||||
|| rootProject.sanctuary_version != "0.0.0-alpha.119"
|
||||
|| rootProject.sanctuary_version != "0.0.0-alpha.120"
|
||||
|| migration.schema_version != 1
|
||||
|| migration.source?.pack_version != "26.2.0-alpha.201"
|
||||
|| migration.target?.pack_version != "26.2.0-alpha.202"
|
||||
@@ -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.210"
|
||||
if (rootProject.pack_version != "26.2.0-alpha.215"
|
||||
|| 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.210.mrpack"
|
||||
|| release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack"
|
||||
|| prism.versionId != rootProject.pack_version
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.210"')
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.215"')
|
||||
|| !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.210"
|
||||
if (rootProject.pack_version != "26.2.0-alpha.215"
|
||||
|| 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.210.mrpack"
|
||||
|| release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack"
|
||||
|| prism.versionId != rootProject.pack_version
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.210"')
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.215"')
|
||||
|| !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.210"
|
||||
if (rootProject.pack_version != "26.2.0-alpha.215"
|
||||
|| 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.210.mrpack"
|
||||
|| release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack"
|
||||
|| prism.versionId != rootProject.pack_version
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.210"')
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.215"')
|
||||
|| !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.210"
|
||||
if (rootProject.pack_version != "26.2.0-alpha.215"
|
||||
|| 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.210.mrpack"
|
||||
|| release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack"
|
||||
|| prism.versionId != rootProject.pack_version
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.210"')
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.215"')
|
||||
|| !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.210"
|
||||
if (rootProject.pack_version != "26.2.0-alpha.215"
|
||||
|| 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.210.mrpack"
|
||||
|| release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack"
|
||||
|| prism.versionId != rootProject.pack_version
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.210"')
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.215"')
|
||||
|| !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.210"
|
||||
if (rootProject.pack_version != "26.2.0-alpha.215"
|
||||
|| rootProject.itsalive_version != "0.0.0-alpha.36"
|
||||
|| rootProject.ambiance_version != "0.0.0-alpha.15"
|
||||
|| rootProject.ambiance_version != "0.0.0-alpha.18"
|
||||
|| migration.issue != 35
|
||||
|| migration.source?.fabric_id != "canaplia"
|
||||
|| migration.source?.version != "2.0.0"
|
||||
@@ -5384,6 +5384,8 @@ tasks.named("verifyWorkspace") {
|
||||
dependsOn "verifyCanapliaGameplay"
|
||||
dependsOn "verifyCanapliaAlpha209Release"
|
||||
dependsOn "verifyAlpha210Release"
|
||||
dependsOn "verifyAlpha211Release"
|
||||
dependsOn "verifyAlpha212Release"
|
||||
dependsOn tasks.named("verifyWaystoneShopCulinaryAlpha202Release")
|
||||
dependsOn tasks.named("verifySafeVaultFeature")
|
||||
dependsOn tasks.named("verifySafeVaultInterfaceAlpha203Release")
|
||||
@@ -5567,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.210"
|
||||
|| rootProject.ambiance_version != "0.0.0-alpha.15"
|
||||
if (rootProject.pack_version != "26.2.0-alpha.215"
|
||||
|| rootProject.ambiance_version != "0.0.0-alpha.18"
|
||||
|| 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"
|
||||
@@ -5615,12 +5617,12 @@ 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.210.mrpack"
|
||||
|| release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack"
|
||||
|| prism.versionId != rootProject.pack_version
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.210"')
|
||||
|| !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.14.jar"')
|
||||
|| !packwizIndex.contains('file = "mods/itsalive-0.0.0-alpha.35.jar"')
|
||||
|| !packwizIndex.contains('file = "mods/onlyfun-0.0.0-alpha.21.jar"')
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.215"')
|
||||
|| !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.18.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"')
|
||||
|| packwizIndex.contains('file = "mods/itsalive-0.0.0-alpha.33.jar"')
|
||||
|| packwizIndex.contains('file = "mods/onlyfun-0.0.0-alpha.19.jar"')
|
||||
@@ -5667,17 +5669,26 @@ tasks.register("verifyAlpha210Release") {
|
||||
onlyfun: "0.0.0-alpha.21",
|
||||
iliketomoveit: "0.0.0-alpha.15",
|
||||
itsalive: "0.0.0-alpha.35"]
|
||||
def requiredJars = expectedTarget.collect { id, version ->
|
||||
def currentModules = [
|
||||
ambiance: "0.0.0-alpha.18",
|
||||
sanctuary: "0.0.0-alpha.120",
|
||||
onlyfun: "0.0.0-alpha.24",
|
||||
ouch: "0.0.0-alpha.10",
|
||||
iliketomoveit: "0.0.0-alpha.15",
|
||||
itsalive: "0.0.0-alpha.36"]
|
||||
def requiredJars = currentModules.collect { id, version ->
|
||||
"file = \"mods/${id}-${version}.jar\""
|
||||
}
|
||||
def obsoleteJars = expectedSource.collect { id, version ->
|
||||
def obsoleteJars = expectedTarget.findAll { id, version ->
|
||||
currentModules[id] != version
|
||||
}.collect { id, version ->
|
||||
"file = \"mods/${id}-${version}.jar\""
|
||||
}
|
||||
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.210"
|
||||
|| rootProject.sanctuary_version != "0.0.0-alpha.119"
|
||||
if (rootProject.pack_version != "26.2.0-alpha.215"
|
||||
|| rootProject.sanctuary_version != "0.0.0-alpha.120"
|
||||
|| rootProject.onlyfun_version != "0.0.0-alpha.24"
|
||||
|| rootProject.iliketomoveit_version != expectedTarget.iliketomoveit
|
||||
|| rootProject.itsalive_version != "0.0.0-alpha.36"
|
||||
@@ -5722,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.210"
|
||||
|| release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.210.mrpack"
|
||||
|| prism.versionId != "26.2.0-alpha.210"
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.210"')
|
||||
|| 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"')
|
||||
|| requiredJars.any { !packwizIndex.contains(it) }
|
||||
|| obsoleteJars.any { packwizIndex.contains(it) }
|
||||
|| jeiFiles.size() != 1
|
||||
@@ -5737,6 +5748,411 @@ tasks.register("verifyAlpha210Release") {
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register("verifyAlpha211Release") {
|
||||
group = "verification"
|
||||
description = "Checks the Sanctuary 26.2.0-alpha.211 Abjection and gameplay-polish release."
|
||||
inputs.file(file("pack/migrations/26.2.0-alpha.210-abjection-and-polish-to-alpha.211.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.files(["ambiance", "itsalive", "onlyfun", "ouch", "sanctuary"].collect { id ->
|
||||
file("${id}/src/main/resources/fabric.mod.json")
|
||||
})
|
||||
doLast {
|
||||
def migration = new JsonSlurper().parse(file(
|
||||
"pack/migrations/26.2.0-alpha.210-abjection-and-polish-to-alpha.211.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 expectedSource = [
|
||||
ambiance: "0.0.0-alpha.14",
|
||||
itsalive: "0.0.0-alpha.35",
|
||||
onlyfun: "0.0.0-alpha.21",
|
||||
ouch: "0.0.0-alpha.9",
|
||||
sanctuary: "0.0.0-alpha.118"]
|
||||
def expectedTarget = [
|
||||
ambiance: "0.0.0-alpha.15",
|
||||
itsalive: "0.0.0-alpha.36",
|
||||
onlyfun: "0.0.0-alpha.24",
|
||||
ouch: "0.0.0-alpha.10",
|
||||
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"]
|
||||
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 ->
|
||||
[(id): new JsonSlurper().parse(file("${id}/src/main/resources/fabric.mod.json"))]
|
||||
}
|
||||
def manifestDataVersions = manifests.collectEntries { id, manifest ->
|
||||
[(id): manifest.custom?.sanctuary26?.data_version]
|
||||
}
|
||||
def manifestProtocols = manifests.collectEntries { id, manifest ->
|
||||
[(id): manifest.custom?.sanctuary26?.network_protocol]
|
||||
}
|
||||
def requiredJars = currentModules.collect { id, version ->
|
||||
"file = \"mods/${id}-${version}.jar\""
|
||||
}
|
||||
def obsoleteJars = expectedTarget.findAll { id, version ->
|
||||
currentModules[id] != version
|
||||
}.collect { id, version ->
|
||||
"file = \"mods/${id}-${version}.jar\""
|
||||
}
|
||||
def expectedIds = [
|
||||
"ambiance:white_disc", "abjection:shit_ball", "abjection:shit_cube"]
|
||||
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"
|
||||
|| workspaceModules.any { id, version -> rootProject.property("${id}_version") != version }
|
||||
|| migration.source?.pack_version != "26.2.0-alpha.210"
|
||||
|| migration.source?.modules != expectedSource
|
||||
|| migration.target?.pack_version != "26.2.0-alpha.211"
|
||||
|| migration.target?.modules != expectedTarget
|
||||
|| migration.features?.canaplia_codex_uses_vanilla_book_pages != true
|
||||
|| migration.features?.black_market_middle_click_restored != true
|
||||
|| migration.features?.white_disc_youtube_audio != true
|
||||
|| migration.features?.white_disc_max_concurrent_streams != 4
|
||||
|| migration.features?.abjection_server_actions != ["piss", "vomit", "shit", "smoke"]
|
||||
|| migration.features?.abjection_shit_ball_projectile != true
|
||||
|| migration.features?.abjection_shit_cube != true
|
||||
|| migration.features?.abjection_default_key != "J"
|
||||
|| migration.features?.abjection_projectile_nausea_seconds != 7
|
||||
|| migration.compatibility?.new_world_required != false
|
||||
|| migration.compatibility?.save_reset_required != false
|
||||
|| migration.compatibility?.existing_saves_supported != true
|
||||
|| migration.compatibility?.registry_ids_added != expectedIds
|
||||
|| migration.compatibility?.data_versions != expectedDataVersions
|
||||
|| migration.compatibility?.network_protocols != expectedProtocols
|
||||
|| manifestDataVersions != expectedDataVersions
|
||||
|| manifestProtocols != expectedProtocols
|
||||
|| 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
|
||||
|| release.pack_version != rootProject.pack_version
|
||||
|| release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.215.mrpack"
|
||||
|| prism.versionId != rootProject.pack_version
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.215"')
|
||||
|| requiredJars.any { !packwizIndex.contains(it) }
|
||||
|| obsoleteJars.any { packwizIndex.contains(it) }
|
||||
|| prism.files?.size() != 5
|
||||
|| jeiFiles.size() != 1
|
||||
|| 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`**")) {
|
||||
throw new GradleException("The alpha.211 Abjection and gameplay-polish release is incomplete")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register("verifyAlpha212Release") {
|
||||
group = "verification"
|
||||
description = "Checks the Sanctuary 26.2.0-alpha.212 Black Market startup fix release."
|
||||
inputs.file(file("pack/migrations/26.2.0-alpha.211-black-market-mixin-fix-to-alpha.212.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("sanctuary/src/main/resources/fabric.mod.json"))
|
||||
inputs.file(file(
|
||||
"sanctuary/src/main/java/fr/koka99cab/sanctuary26/sanctuary/mixin/client/MinecraftMixin.java"))
|
||||
doLast {
|
||||
def migration = new JsonSlurper().parse(file(
|
||||
"pack/migrations/26.2.0-alpha.211-black-market-mixin-fix-to-alpha.212.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("sanctuary/src/main/resources/fabric.mod.json"))
|
||||
def minecraftMixin = file(
|
||||
"sanctuary/src/main/java/fr/koka99cab/sanctuary26/sanctuary/mixin/client/MinecraftMixin.java").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"
|
||||
|| 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"]
|
||||
|| migration.target?.pack_version != "26.2.0-alpha.212"
|
||||
|| migration.target?.modules != [sanctuary: "0.0.0-alpha.120"]
|
||||
|| migration.features?.black_market_middle_click_preserved != true
|
||||
|| migration.features?.minecraft_mixin_target != "pickBlockOrEntity"
|
||||
|| migration.features?.client_startup_crash_fixed != 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?.sanctuary_data_version != 11
|
||||
|| migration.compatibility?.sanctuary_network_protocol != 22
|
||||
|| 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 != 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"
|
||||
|| prism.files?.size() != 5
|
||||
|| jeiFiles.size() != 1
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.215"')
|
||||
|| !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`**")) {
|
||||
throw new GradleException("The alpha.212 Black Market startup-fix release is incomplete")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register("verifyAlpha213Release") {
|
||||
group = "verification"
|
||||
description = "Checks the Sanctuary 26.2.0-alpha.213 Ambiance startup fix release."
|
||||
inputs.file(file("pack/migrations/26.2.0-alpha.212-ambiance-level-event-fix-to-alpha.213.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/src/main/java/fr/koka99cab/sanctuary26/ambiance/mixin/client/LevelEventHandlerMixin.java"))
|
||||
doLast {
|
||||
def migration = new JsonSlurper().parse(file(
|
||||
"pack/migrations/26.2.0-alpha.212-ambiance-level-event-fix-to-alpha.213.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 levelEventMixin = file(
|
||||
"ambiance/src/main/java/fr/koka99cab/sanctuary26/ambiance/mixin/client/LevelEventHandlerMixin.java").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"
|
||||
|| rootProject.ambiance_version != "0.0.0-alpha.18"
|
||||
|| 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"
|
||||
|| migration.target?.modules != [ambiance: "0.0.0-alpha.16"]
|
||||
|| migration.features?.white_disc_stop_event_preserved != true
|
||||
|| migration.features?.minecraft_mixin_target_class != "LevelEventHandler"
|
||||
|| migration.features?.minecraft_mixin_target_method != "levelEvent"
|
||||
|| migration.features?.client_startup_crash_fixed != 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
|
||||
|| !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"
|
||||
|| 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"')
|
||||
|| 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`**")) {
|
||||
throw new GradleException("The alpha.213 Ambiance startup-fix release is incomplete")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register("verifyAlpha214Release") {
|
||||
group = "verification"
|
||||
description = "Checks the Sanctuary 26.2.0-alpha.214 white-disc solo synchronization release."
|
||||
inputs.file(file("pack/migrations/26.2.0-alpha.213-white-disc-solo-sync-to-alpha.214.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/src/main/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscAudioPlayer.java"))
|
||||
inputs.file(file(
|
||||
"ambiance/src/test/java/fr/koka99cab/sanctuary26/ambiance/white_disc/WhiteDiscUrlSmoke.java"))
|
||||
doLast {
|
||||
def migration = new JsonSlurper().parse(file(
|
||||
"pack/migrations/26.2.0-alpha.213-white-disc-solo-sync-to-alpha.214.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 audioPlayer = file(
|
||||
"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"
|
||||
|| 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"
|
||||
|| migration.target?.modules != [ambiance: "0.0.0-alpha.17"]
|
||||
|| migration.features?.white_disc_solo_playback_restored != true
|
||||
|| migration.features?.client_jukebox_sync_wait_ticks != 100
|
||||
|| migration.features?.loading_feedback_immediate != true
|
||||
|| migration.features?.sync_timeout_feedback != true
|
||||
|| migration.features?.youtube_share_parameters_supported != 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
|
||||
|| !audioPlayer.contains("MAXIMUM_START_WAIT_TICKS = 100")
|
||||
|| !audioPlayer.contains("PENDING_STARTS")
|
||||
|| !audioPlayer.contains("tickPendingStarts(client)")
|
||||
|| !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"
|
||||
|| prism.files?.size() != 5
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.215"')
|
||||
|| !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.18.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`**")) {
|
||||
throw new GradleException("The alpha.214 white-disc solo synchronization release is incomplete")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register("verifyAlpha215Release") {
|
||||
group = "verification"
|
||||
description = "Checks the Sanctuary 26.2.0-alpha.215 resilient white-disc playback release."
|
||||
inputs.file(file("pack/migrations/26.2.0-alpha.214-white-disc-playback-crash-to-alpha.215.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/WhiteDiscPlaybackSmoke.java"))
|
||||
doLast {
|
||||
def migration = new JsonSlurper().parse(file(
|
||||
"pack/migrations/26.2.0-alpha.214-white-disc-playback-crash-to-alpha.215.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 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"
|
||||
|| 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"
|
||||
|| migration.target?.modules != [ambiance: "0.0.0-alpha.18"]
|
||||
|| migration.features?.white_disc_native_crash_fixed != true
|
||||
|| migration.features?.openal_channel_release_owned_by_audio_thread != true
|
||||
|| migration.features?.youtube_client_profile != "Ios"
|
||||
|| migration.features?.youtube_source_commit != "f45bbb7aebfcbc1c553769e04af6cd43afa8b7c3"
|
||||
|| migration.features?.initial_stream_wait_bounded != true
|
||||
|| migration.features?.subsequent_stream_polls_non_blocking != true
|
||||
|| migration.features?.playback_errors_stop_safely != true
|
||||
|| migration.features?.live_pcm_smoke_video_id != "Ue5ZBe-GzSM"
|
||||
|| 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("f45bbb7aebfcbc1c553769e04af6cd43afa8b7c3-SNAPSHOT")
|
||||
|| !ambianceBuild.contains('tasks.register("whiteDiscPlaybackSmoke"')
|
||||
|| !audioPlayer.contains("new YoutubeAudioSourceManager(false, new Ios())")
|
||||
|| !audioPlayer.contains("player.addListener(new AudioEventAdapter()")
|
||||
|| !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("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"
|
||||
|| prism.files?.size() != 5
|
||||
|| !packwiz.contains('version = "26.2.0-alpha.215"')
|
||||
|| !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.18.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`**")) {
|
||||
throw new GradleException("The alpha.215 resilient white-disc playback release is incomplete")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tasks.named("verifyWorkspace") {
|
||||
dependsOn tasks.named("verifyAlpha213Release")
|
||||
dependsOn tasks.named("verifyAlpha214Release")
|
||||
dependsOn tasks.named("verifyAlpha215Release")
|
||||
}
|
||||
|
||||
tasks.named("check") {
|
||||
dependsOn tasks.named("verifyWorkspace")
|
||||
dependsOn tasks.named("verifyTransport")
|
||||
|
||||
+3
-3
@@ -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.15
|
||||
ambiance_version=0.0.0-alpha.18
|
||||
ambiance_lifecycle=active
|
||||
redstoner_version=0.0.0-alpha.10
|
||||
redstoner_lifecycle=active
|
||||
@@ -28,7 +28,7 @@ iliketomoveit_version=0.0.0-alpha.15
|
||||
iliketomoveit_lifecycle=active
|
||||
onlyfun_version=0.0.0-alpha.24
|
||||
onlyfun_lifecycle=active
|
||||
sanctuary_version=0.0.0-alpha.119
|
||||
sanctuary_version=0.0.0-alpha.120
|
||||
sanctuary_lifecycle=active
|
||||
pack_version=26.2.0-alpha.210
|
||||
pack_version=26.2.0-alpha.215
|
||||
maven_group=fr.koka99cab.sanctuary26
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"schema_version": 1,
|
||||
"source": {
|
||||
"pack_version": "26.2.0-alpha.210",
|
||||
"modules": {
|
||||
"ambiance": "0.0.0-alpha.14",
|
||||
"itsalive": "0.0.0-alpha.35",
|
||||
"onlyfun": "0.0.0-alpha.21",
|
||||
"ouch": "0.0.0-alpha.9",
|
||||
"sanctuary": "0.0.0-alpha.118"
|
||||
}
|
||||
},
|
||||
"target": {
|
||||
"pack_version": "26.2.0-alpha.211",
|
||||
"modules": {
|
||||
"ambiance": "0.0.0-alpha.15",
|
||||
"itsalive": "0.0.0-alpha.36",
|
||||
"onlyfun": "0.0.0-alpha.24",
|
||||
"ouch": "0.0.0-alpha.10",
|
||||
"sanctuary": "0.0.0-alpha.119"
|
||||
}
|
||||
},
|
||||
"features": {
|
||||
"canaplia_codex_uses_vanilla_book_pages": true,
|
||||
"black_market_middle_click_restored": true,
|
||||
"white_disc_youtube_audio": true,
|
||||
"white_disc_max_concurrent_streams": 4,
|
||||
"abjection_server_actions": ["piss", "vomit", "shit", "smoke"],
|
||||
"abjection_shit_ball_projectile": true,
|
||||
"abjection_shit_cube": true,
|
||||
"abjection_default_key": "J",
|
||||
"abjection_projectile_nausea_seconds": 7
|
||||
},
|
||||
"compatibility": {
|
||||
"new_world_required": false,
|
||||
"save_reset_required": false,
|
||||
"existing_saves_supported": true,
|
||||
"registry_ids_added": [
|
||||
"ambiance:white_disc",
|
||||
"abjection:shit_ball",
|
||||
"abjection:shit_cube"
|
||||
],
|
||||
"data_versions": {
|
||||
"ambiance": 2,
|
||||
"itsalive": 3,
|
||||
"onlyfun": 2,
|
||||
"ouch": 1,
|
||||
"sanctuary": 11
|
||||
},
|
||||
"network_protocols": {
|
||||
"ambiance": 6,
|
||||
"itsalive": 4,
|
||||
"onlyfun": 3,
|
||||
"ouch": 1,
|
||||
"sanctuary": 22
|
||||
}
|
||||
},
|
||||
"distribution": {
|
||||
"pack_release_updated": true,
|
||||
"packwiz_index_refreshed": true,
|
||||
"prism_modrinth_index_updated": true,
|
||||
"shared_client_server_mrpack": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"schema_version": 1,
|
||||
"source": {
|
||||
"pack_version": "26.2.0-alpha.211",
|
||||
"modules": {
|
||||
"sanctuary": "0.0.0-alpha.119"
|
||||
}
|
||||
},
|
||||
"target": {
|
||||
"pack_version": "26.2.0-alpha.212",
|
||||
"modules": {
|
||||
"sanctuary": "0.0.0-alpha.120"
|
||||
}
|
||||
},
|
||||
"features": {
|
||||
"black_market_middle_click_preserved": true,
|
||||
"minecraft_mixin_target": "pickBlockOrEntity",
|
||||
"client_startup_crash_fixed": true
|
||||
},
|
||||
"compatibility": {
|
||||
"new_world_required": false,
|
||||
"save_reset_required": false,
|
||||
"existing_saves_supported": true,
|
||||
"registry_ids_changed": false,
|
||||
"sanctuary_data_version": 11,
|
||||
"sanctuary_network_protocol": 22
|
||||
},
|
||||
"distribution": {
|
||||
"pack_release_updated": true,
|
||||
"packwiz_index_refreshed": true,
|
||||
"prism_modrinth_index_updated": true,
|
||||
"shared_client_server_mrpack": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"schema_version": 1,
|
||||
"source": {
|
||||
"pack_version": "26.2.0-alpha.212",
|
||||
"modules": {
|
||||
"ambiance": "0.0.0-alpha.15"
|
||||
}
|
||||
},
|
||||
"target": {
|
||||
"pack_version": "26.2.0-alpha.213",
|
||||
"modules": {
|
||||
"ambiance": "0.0.0-alpha.16"
|
||||
}
|
||||
},
|
||||
"features": {
|
||||
"white_disc_stop_event_preserved": true,
|
||||
"minecraft_mixin_target_class": "LevelEventHandler",
|
||||
"minecraft_mixin_target_method": "levelEvent",
|
||||
"client_startup_crash_fixed": 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
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"schema_version": 1,
|
||||
"source": {
|
||||
"pack_version": "26.2.0-alpha.213",
|
||||
"modules": {
|
||||
"ambiance": "0.0.0-alpha.16"
|
||||
}
|
||||
},
|
||||
"target": {
|
||||
"pack_version": "26.2.0-alpha.214",
|
||||
"modules": {
|
||||
"ambiance": "0.0.0-alpha.17"
|
||||
}
|
||||
},
|
||||
"features": {
|
||||
"white_disc_solo_playback_restored": true,
|
||||
"client_jukebox_sync_wait_ticks": 100,
|
||||
"loading_feedback_immediate": true,
|
||||
"sync_timeout_feedback": true,
|
||||
"youtube_share_parameters_supported": 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
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"schema_version": 1,
|
||||
"source": {
|
||||
"pack_version": "26.2.0-alpha.214",
|
||||
"modules": {
|
||||
"ambiance": "0.0.0-alpha.17"
|
||||
}
|
||||
},
|
||||
"target": {
|
||||
"pack_version": "26.2.0-alpha.215",
|
||||
"modules": {
|
||||
"ambiance": "0.0.0-alpha.18"
|
||||
}
|
||||
},
|
||||
"features": {
|
||||
"white_disc_native_crash_fixed": true,
|
||||
"openal_channel_release_owned_by_audio_thread": true,
|
||||
"youtube_client_profile": "Ios",
|
||||
"youtube_source_commit": "f45bbb7aebfcbc1c553769e04af6cd43afa8b7c3",
|
||||
"initial_stream_wait_bounded": true,
|
||||
"subsequent_stream_polls_non_blocking": true,
|
||||
"playback_errors_stop_safely": true,
|
||||
"live_pcm_smoke_video_id": "Ue5ZBe-GzSM"
|
||||
},
|
||||
"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
|
||||
}
|
||||
}
|
||||
+15
-15
@@ -13,16 +13,16 @@ file = "instance-icon.png"
|
||||
hash = "41f4f4c88c71d0a23446d5014f7407d55ad477441847099cad24492b032335a0"
|
||||
|
||||
[[files]]
|
||||
file = "mods/ambiance-0.0.0-alpha.14.jar"
|
||||
hash = "a4b2a36e046a3095ada58e3dbf5fd30ab7c8ba42eaf2abcf513b38b8cc2f3e4a"
|
||||
file = "mods/ambiance-0.0.0-alpha.18.jar"
|
||||
hash = "c029bbdf428e4037c22185680629b641c8bd6e60465fa72e3498b88bdc8d74f9"
|
||||
|
||||
[[files]]
|
||||
file = "mods/anotherworld-0.0.0-alpha.55.jar"
|
||||
hash = "da7163a34ca71e1c2385a84221cddccc09f0f83d9a00bce0ed6263b19ec519cb"
|
||||
hash = "c2649632bbce4ac134cc7cb6bd17b318f395fe878a1e61fdbdfffb880415f4aa"
|
||||
|
||||
[[files]]
|
||||
file = "mods/events-0.0.0-alpha.0.jar"
|
||||
hash = "7400d63c905d1c87a5290adaa2fe91305fa1f067827ca8f0610a6ae4e17624da"
|
||||
hash = "4cb03d4d24c469e2cf578a1f46d93bbaa69ecc26e83f9a786758cee744fe160d"
|
||||
|
||||
[[files]]
|
||||
file = "mods/fabric-api.pw.toml"
|
||||
@@ -31,7 +31,7 @@ metafile = true
|
||||
|
||||
[[files]]
|
||||
file = "mods/iliketomoveit-0.0.0-alpha.15.jar"
|
||||
hash = "a084cf25a4afa50086ce220f40b6b3946a06389de105f23c0246df1577deb3c8"
|
||||
hash = "3adaa6926d0a22d6c7f3a30260457d2e7ddc3ce145fa84d7b1156305645400a5"
|
||||
|
||||
[[files]]
|
||||
file = "mods/iris.pw.toml"
|
||||
@@ -39,8 +39,8 @@ hash = "84a3cef87679c0d21dceb4641167dc0368b9a3593698f6a3632485e9b3a8d5da"
|
||||
metafile = true
|
||||
|
||||
[[files]]
|
||||
file = "mods/itsalive-0.0.0-alpha.35.jar"
|
||||
hash = "4a6433abdfc03a0872f7c810fb17016a0f20acda5e223e0fef479dd786cc73ac"
|
||||
file = "mods/itsalive-0.0.0-alpha.36.jar"
|
||||
hash = "9cfcc87d6018573fb45a37b71ceb019ba65253ef973cdc8b5c39a78792bff691"
|
||||
|
||||
[[files]]
|
||||
file = "mods/jei.pw.toml"
|
||||
@@ -49,23 +49,23 @@ metafile = true
|
||||
|
||||
[[files]]
|
||||
file = "mods/masterkey-0.0.0-alpha.8.jar"
|
||||
hash = "eaf70f6c5a78ee7ab2d3be498d4f7d67fcba433ed61b65b305e958f03b387d94"
|
||||
hash = "c88d26fd649ad841b69d7fb72b075c392e4b878bc1bdeea811dd3d549625b33b"
|
||||
|
||||
[[files]]
|
||||
file = "mods/onlyfun-0.0.0-alpha.21.jar"
|
||||
hash = "7e319a0cc6149d5819ef2359fe3ad4035066a9cddd5ae0a16c12c9db64bc3f6a"
|
||||
file = "mods/onlyfun-0.0.0-alpha.24.jar"
|
||||
hash = "a3c50be3b95705c5dd8b547599610af8332765215f1749818a18e504a00866a4"
|
||||
|
||||
[[files]]
|
||||
file = "mods/ouch-0.0.0-alpha.9.jar"
|
||||
hash = "f3cf2d8c83afa32b1c70e8239dd514be3c74834397f9d09efe177bc8c5ef9ac4"
|
||||
file = "mods/ouch-0.0.0-alpha.10.jar"
|
||||
hash = "0304e064ac3e497c9f8fcf8836575add04ea96f46d35fdbe6da50e926c070ff1"
|
||||
|
||||
[[files]]
|
||||
file = "mods/redstoner-0.0.0-alpha.10.jar"
|
||||
hash = "a9049b9d3a323015545194c92ce9da7a5dca4ff9a28ea26b02bead96748328ab"
|
||||
hash = "db41fcbd3daab88d17daf03ae5f7bc0aa134d6e1663ff6edfd80a7983f13a779"
|
||||
|
||||
[[files]]
|
||||
file = "mods/sanctuary-0.0.0-alpha.118.jar"
|
||||
hash = "1a1319e5f09de941ad8a7561aff9d2fb8c7460a8cd8d2374817d8f39c5682030"
|
||||
file = "mods/sanctuary-0.0.0-alpha.120.jar"
|
||||
hash = "6f67724d6813d473ea06c62cdfd5d617a27199d6061895b89f62bb5d31becb8b"
|
||||
|
||||
[[files]]
|
||||
file = "mods/simple-voice-chat.pw.toml"
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
name = "Sanctuary 26.2"
|
||||
author = "KOKA99CAB"
|
||||
version = "26.2.0-alpha.210"
|
||||
version = "26.2.0-alpha.215"
|
||||
pack-format = "packwiz:1.1.0"
|
||||
|
||||
[index]
|
||||
file = "index.toml"
|
||||
hash-format = "sha256"
|
||||
hash = "e20c051f8895ce3164ec72b7764b8904f411e36f63bf1e046b1bcc9108d00a31"
|
||||
hash = "17231ac01c162a453e9000ee6419f7fbc884cf4b94c3b0956c12596cf36df9dd"
|
||||
|
||||
[versions]
|
||||
fabric = "0.19.3"
|
||||
|
||||
@@ -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.210",
|
||||
"versionId": "26.2.0-alpha.215",
|
||||
"files": [
|
||||
{
|
||||
"path": "mods/fabric-api-0.158.0+26.2.jar",
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schema_version": 1,
|
||||
"pack_version": "26.2.0-alpha.210",
|
||||
"pack_version": "26.2.0-alpha.215",
|
||||
"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.210.mrpack",
|
||||
"primary_file": "sanctuary-26.2.0-alpha.215.mrpack",
|
||||
"shared_client_server_pack": true,
|
||||
"update_owner": "packwiz-installer",
|
||||
"check_on_launch": true,
|
||||
|
||||
+11
-11
@@ -121,7 +121,7 @@ tasks.register("verifyBlackMarket") {
|
||||
def questData = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/shop/QuestBoardData.java").text
|
||||
def quests = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/shop/QuestBoardService.java").text
|
||||
def inventoryView = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/api/inventory/SanctuaryPlayerInventoryView.java").text
|
||||
if (project.version.toString() != "0.0.0-alpha.119"
|
||||
if (project.version.toString() != "0.0.0-alpha.120"
|
||||
|| !data.contains('SAVE_KEY = "black_market"') || !data.contains("DATA_VERSION = 2")
|
||||
|| !data.contains("ItemStack.CODEC.fieldOf(\"item\")") || !data.contains("replaceListing")
|
||||
|| !service.contains("LISTING_FEE_RUBIES = 1") || !service.contains("COMMISSION_PERCENT = 5")
|
||||
@@ -132,7 +132,7 @@ tasks.register("verifyBlackMarket") {
|
||||
|| !interactionRules.contains("middleClick || secondaryUse")
|
||||
|| !client.contains("handleBlackMarketMiddleClick")
|
||||
|| !client.contains("ClientPlayNetworking.send(new BlackMarketInteractPayload())")
|
||||
|| !minecraftMixin.contains('method = "pickBlock"')
|
||||
|| !minecraftMixin.contains('method = "pickBlockOrEntity"')
|
||||
|| !middleClickPayload.contains('SanctuaryMod.id("c2s/black_market_interact")')
|
||||
|| !middleClickPayload.contains("No client position, listing ID, item or price is trusted")
|
||||
|| !network.contains("PROTOCOL_VERSION = 22")
|
||||
@@ -2818,7 +2818,7 @@ tasks.register("verifyShopCurrencyRowsRelease") {
|
||||
"src/main/java/fr/koka99cab/sanctuary26/sanctuary/shop/BlackMarketService.java").text
|
||||
def shop = file(
|
||||
"src/main/java/fr/koka99cab/sanctuary26/sanctuary/shop/ShopService.java").text
|
||||
if (project.version.toString() != "0.0.0-alpha.119"
|
||||
if (project.version.toString() != "0.0.0-alpha.120"
|
||||
|| migration.target?.modules?.sanctuary != "0.0.0-alpha.117"
|
||||
|| migration.shop_currency_inventory?.all_unlocked_rows_counted != true
|
||||
|| migration.shop_currency_inventory?.overflow_rows_counted != true
|
||||
@@ -2984,7 +2984,7 @@ tasks.register("verifyProgressivePauseMenu") {
|
||||
"pack/migrations/26.2.0-alpha.190-progressive-pause-menu-to-alpha.191.json"))
|
||||
def pauseMenu = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/mixin/client/PauseScreenMixin.java").text
|
||||
def costs = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/progression/SanctuaryProgressionCosts.java").text
|
||||
if (project.version.toString() != "0.0.0-alpha.119"
|
||||
if (project.version.toString() != "0.0.0-alpha.120"
|
||||
|| migration.target?.pack_version != "26.2.0-alpha.191"
|
||||
|| migration.target?.modules?.sanctuary != "0.0.0-alpha.109"
|
||||
|| migration.pause_menu?.progression_full_width != true
|
||||
@@ -3022,7 +3022,7 @@ tasks.register("verifyShopPricingLayout") {
|
||||
"pack/migrations/26.2.0-alpha.192-shop-pricing-layout-to-alpha.193.json"))
|
||||
def screen = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/client/SanctuaryShopScreen.java").text
|
||||
def progression = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/shop/ShopProgression.java").text
|
||||
if (project.version.toString() != "0.0.0-alpha.119"
|
||||
if (project.version.toString() != "0.0.0-alpha.120"
|
||||
|| migration.target?.modules?.sanctuary != "0.0.0-alpha.110"
|
||||
|| migration.shop_layout?.locked_offer_buttons != 6
|
||||
|| migration.shop_layout?.button_slots != [4, 5, 6, 7, 8, 9]
|
||||
@@ -3053,7 +3053,7 @@ tasks.register("verifyShopCsvBossGates") {
|
||||
"pack/migrations/26.2.0-alpha.194-shop-csv-boss-gates-to-alpha.195.json"))
|
||||
def provider = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/shop/ShopCatalogProvider.java").text
|
||||
def catalog = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/shop/ShopOfferCatalog.java").text
|
||||
if (project.version.toString() != "0.0.0-alpha.119"
|
||||
if (project.version.toString() != "0.0.0-alpha.120"
|
||||
|| migration.target?.pack_version != "26.2.0-alpha.195"
|
||||
|| migration.target?.modules?.sanctuary != "0.0.0-alpha.111"
|
||||
|| migration.compatibility?.sanctuary_data_version != 11
|
||||
@@ -3084,7 +3084,7 @@ tasks.register("verifyDeliveryBoxOrientation") {
|
||||
def blockstate = new JsonSlurper().parse(
|
||||
file("src/main/resources/assets/sanctuary/blockstates/delivery_box.json"))
|
||||
def expectedVariants = ["facing=north", "facing=east", "facing=south", "facing=west"].toSet()
|
||||
if (project.version.toString() != "0.0.0-alpha.119"
|
||||
if (project.version.toString() != "0.0.0-alpha.120"
|
||||
|| migration.target?.modules?.sanctuary != "0.0.0-alpha.112"
|
||||
|| migration.mailbox?.id != "sanctuary:delivery_box"
|
||||
|| migration.mailbox?.horizontal_facing != true
|
||||
@@ -3112,7 +3112,7 @@ tasks.register("verifyInventoryShiftClick") {
|
||||
def mixin = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/mixin/AbstractContainerMenuMixin.java").text
|
||||
def screen = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/mixin/client/AbstractContainerScreenMixin.java").text
|
||||
def gui = file("INVENTORY_GUI.md").text
|
||||
if (project.version.toString() != "0.0.0-alpha.119"
|
||||
if (project.version.toString() != "0.0.0-alpha.120"
|
||||
|| !transfer.contains("shouldAppendOverflow")
|
||||
|| !transfer.contains("isVanillaStorageRange")
|
||||
|| !transfer.contains("hotbarStart")
|
||||
@@ -3158,7 +3158,7 @@ tasks.register("verifyQuestRequests") {
|
||||
new JsonSlurper().parse(file("src/main/resources/data/sanctuary/loot_table/blocks/${path}.json"))
|
||||
.pools[0].entries[0].name
|
||||
}
|
||||
if (project.version.toString() != "0.0.0-alpha.119"
|
||||
if (project.version.toString() != "0.0.0-alpha.120"
|
||||
|| migration.target?.modules?.sanctuary != "0.0.0-alpha.113"
|
||||
|| migration.quest_requests?.save_key != "quest_requests"
|
||||
|| migration.quest_requests?.data_version != 1
|
||||
@@ -3216,7 +3216,7 @@ tasks.register("verifyQuestRequestContracts") {
|
||||
def locales = ["fr_fr", "en_us", "ru_ru"].collectEntries { locale ->
|
||||
[(locale): new JsonSlurper().parse(file("src/main/resources/assets/sanctuary/lang/${locale}.json"))]
|
||||
}
|
||||
if (project.version.toString() != "0.0.0-alpha.119"
|
||||
if (project.version.toString() != "0.0.0-alpha.120"
|
||||
|| migration.source?.pack_version != "26.2.0-alpha.198"
|
||||
|| migration.source?.modules?.sanctuary != "0.0.0-alpha.114"
|
||||
|| migration.target?.pack_version != "26.2.0-alpha.199"
|
||||
@@ -3285,7 +3285,7 @@ tasks.register("verifyQuestRequestEscrow") {
|
||||
def locales = ["fr_fr", "en_us", "ru_ru"].collectEntries { locale ->
|
||||
[(locale): new JsonSlurper().parse(file("src/main/resources/assets/sanctuary/lang/${locale}.json"))]
|
||||
}
|
||||
if (project.version.toString() != "0.0.0-alpha.119"
|
||||
if (project.version.toString() != "0.0.0-alpha.120"
|
||||
|| migration.source?.pack_version != "26.2.0-alpha.200"
|
||||
|| migration.source?.modules?.sanctuary != "0.0.0-alpha.115"
|
||||
|| migration.target?.pack_version != "26.2.0-alpha.201"
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
/** Gives the game window the Sanctuary identity while preserving its connection suffix. */
|
||||
@Mixin(Minecraft.class)
|
||||
public abstract class MinecraftMixin {
|
||||
@Inject(method = "pickBlock", at = @At("HEAD"), cancellable = true)
|
||||
@Inject(method = "pickBlockOrEntity", at = @At("HEAD"), cancellable = true)
|
||||
private void sanctuary$blackMarketMiddleClick(CallbackInfo callback) {
|
||||
if (SanctuaryClient.handleBlackMarketMiddleClick((Minecraft) (Object) this)) callback.cancel();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user