From c973d535a83b1ad0ff203ee6cae5e440657384da Mon Sep 17 00:00:00 2001 From: koka Date: Fri, 4 Sep 2026 04:17:21 +0200 Subject: [PATCH] chore(pack): remove temporary ZEVENT module --- CHANGELOG.md | 10 + README.md | 9 +- build.gradle | 491 +++++++++--------- gradle.properties | 4 +- ...-alpha.235-remove-zevent-to-alpha.236.json | 43 ++ pack/packwiz/index.toml | 4 - pack/packwiz/pack.toml | 4 +- pack/prism/modrinth.index.json | 2 +- pack/release.json | 4 +- settings.gradle | 3 +- zevent/README.md | 19 - zevent/art/icon.svg | 19 - zevent/build.gradle | 13 - .../sanctuary26/zevent/ZeventMod.java | 30 -- .../zevent/block/ZeventScreenBlock.java | 206 -------- .../zevent/block/ZeventScreenLayout.java | 64 --- .../block/entity/ZeventScreenBlockEntity.java | 75 --- .../zevent/client/ZeventClient.java | 29 -- .../client/gui/ZeventScreenOptionsScreen.java | 117 ----- .../ZeventScreenBlockEntityRenderer.java | 90 ---- .../render/state/ZeventScreenRenderState.java | 10 - .../client/twitch/TwitchBrowserManager.java | 243 --------- .../network/OpenScreenOptionsPayload.java | 37 -- .../network/SaveScreenChannelPayload.java | 36 -- .../zevent/network/ZeventNetworking.java | 57 -- .../zevent/registry/ZeventRegistries.java | 69 --- .../zevent/twitch/TwitchChannel.java | 63 --- .../zevent/blockstates/zevent_screen.json | 8 - .../src/main/resources/assets/zevent/icon.png | Bin 21774 -> 0 bytes .../assets/zevent/items/zevent_screen.json | 6 - .../resources/assets/zevent/lang/en_us.json | 18 - .../resources/assets/zevent/lang/fr_fr.json | 18 - .../resources/assets/zevent/lang/ru_ru.json | 18 - .../zevent/models/block/zevent_screen.json | 21 - .../loot_table/blocks/zevent_screen.json | 20 - .../data/zevent/recipe/zevent_screen.json | 19 - zevent/src/main/resources/fabric.mod.json | 44 -- .../zevent/block/ZeventScreenLayoutTest.java | 34 -- .../zevent/twitch/TwitchChannelTest.java | 29 -- 39 files changed, 307 insertions(+), 1679 deletions(-) create mode 100644 pack/migrations/26.2.0-alpha.235-remove-zevent-to-alpha.236.json delete mode 100644 zevent/README.md delete mode 100644 zevent/art/icon.svg delete mode 100644 zevent/build.gradle delete mode 100644 zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/ZeventMod.java delete mode 100644 zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/block/ZeventScreenBlock.java delete mode 100644 zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/block/ZeventScreenLayout.java delete mode 100644 zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/block/entity/ZeventScreenBlockEntity.java delete mode 100644 zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/client/ZeventClient.java delete mode 100644 zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/client/gui/ZeventScreenOptionsScreen.java delete mode 100644 zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/client/render/ZeventScreenBlockEntityRenderer.java delete mode 100644 zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/client/render/state/ZeventScreenRenderState.java delete mode 100644 zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/client/twitch/TwitchBrowserManager.java delete mode 100644 zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/network/OpenScreenOptionsPayload.java delete mode 100644 zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/network/SaveScreenChannelPayload.java delete mode 100644 zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/network/ZeventNetworking.java delete mode 100644 zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/registry/ZeventRegistries.java delete mode 100644 zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/twitch/TwitchChannel.java delete mode 100644 zevent/src/main/resources/assets/zevent/blockstates/zevent_screen.json delete mode 100644 zevent/src/main/resources/assets/zevent/icon.png delete mode 100644 zevent/src/main/resources/assets/zevent/items/zevent_screen.json delete mode 100644 zevent/src/main/resources/assets/zevent/lang/en_us.json delete mode 100644 zevent/src/main/resources/assets/zevent/lang/fr_fr.json delete mode 100644 zevent/src/main/resources/assets/zevent/lang/ru_ru.json delete mode 100644 zevent/src/main/resources/assets/zevent/models/block/zevent_screen.json delete mode 100644 zevent/src/main/resources/data/zevent/loot_table/blocks/zevent_screen.json delete mode 100644 zevent/src/main/resources/data/zevent/recipe/zevent_screen.json delete mode 100644 zevent/src/main/resources/fabric.mod.json delete mode 100644 zevent/src/test/java/fr/koka99cab/sanctuary26/zevent/block/ZeventScreenLayoutTest.java delete mode 100644 zevent/src/test/java/fr/koka99cab/sanctuary26/zevent/twitch/TwitchChannelTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 942ac8d..977ec1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,16 @@ Ce journal suit les **versions du modpack**. Lorsqu'un seul module change, sa ve Aucun changement non publié. +## `26.2.0-alpha.236` + +Module temporaire supprimé : **ZEVENT `0.0.0-alpha.3`**. + +- retire entièrement le sous-projet, le JAR client/serveur et les identifiants `zevent:*` devenus redondants ; +- conserve Dream Displays `1.9.6`, qui fournit directement les écrans et la lecture des flux vidéo ; +- retire automatiquement `zevent-0.0.0-alpha.3.jar` des installations gérées par Packwiz ; +- ne convertit pas les anciens écrans muraux ZEVENT : ils doivent être remplacés par des écrans Dream Displays ; +- conserve sans changement les sauvegardes, inventaires, monnaies et protocoles des dix modules Sanctuary restants. + ## `26.2.0-alpha.235` Module modifié temporairement : **ZEVENT `0.0.0-alpha.3`**. diff --git a/README.md b/README.md index 8de5754..831ea48 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Sanctuary 26.2 -Workspace Fabric multi-projet de Sanctuary 2.0. Il construit temporairement onze JAR pour le week-end ZEVENT, sur Minecraft 26.2, Fabric Loader 0.19.3, Fabric API 0.159.0+26.2, Loom 1.17, Gradle 9.5.1 et Java 25. +Workspace Fabric multi-projet de Sanctuary 2.0. Il construit dix JAR, sur Minecraft 26.2, Fabric Loader 0.19.3, Fabric API 0.159.0+26.2, Loom 1.17, Gradle 9.5.1 et Java 25. Auteur : **KOKA99CAB** Licence : **GNU GPL 3.0 or Later** (`GPL-3.0-or-later`) @@ -19,11 +19,12 @@ Licence : **GNU GPL 3.0 or Later** (`GPL-3.0-or-later`) | `sanctuary` | Sanctuary | progression et aventure | progression globale, classements publics, Atlas et monde principal flottant | | `events` | Events | événements serveur | socle vide | | `masterkey` | MasterKey | administration et diagnostic | laboratoire minimal | -| `zevent` | ZEVENT | diffusion Twitch temporaire | écran mural 9×5, inclus pour le week-end | 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.235`**. Cette release conserve notamment Another World **`0.0.0-alpha.58`**, Sanctuary **`0.0.0-alpha.139`** et Red-Stoner **`0.0.0-alpha.20`**, passe temporairement ZEVENT en **`0.0.0-alpha.3`** et remplace MCEF Modern par Dream Displays **`1.9.6`** afin de décoder réellement les directs Twitch en H.264/AAC. +Version courante du pack distribué : **`26.2.0-alpha.236`**. Cette release conserve les dix modules Sanctuary, notamment Another World **`0.0.0-alpha.58`**, Sanctuary **`0.0.0-alpha.139`** et Red-Stoner **`0.0.0-alpha.20`**, retire entièrement le module temporaire ZEVENT et garde Dream Displays **`1.9.6`** comme solution d’écran vidéo. + +L’alpha.236 supprime le JAR et le code ZEVENT devenus redondants. Packwiz retire automatiquement `zevent-0.0.0-alpha.3.jar` du client et du serveur, tandis que Dream Displays reste installé des deux côtés. Les écrans `zevent:zevent_screen` et leurs chaînes enregistrées ne sont pas convertibles : ils doivent être remplacés par des écrans Dream Displays. Les sauvegardes et données des dix autres modules restent inchangées. L’alpha.235 corrige l’écran noir de ZEVENT. MCEF chargeait correctement l’interface et les liens Twitch, mais son Chromium ne prenait pas en charge les codecs des directs. L’écran utilise désormais le résolveur HLS et le décodeur natif de Dream Displays, conserve ses options et sa synchronisation serveur, réessaie automatiquement un flux indisponible et indique clairement lorsqu’une chaîne est hors ligne. Le volume suit toujours la catégorie Disques, décroît jusqu’à 64 blocs et seul l’écran visible le plus proche reste audible. @@ -423,7 +424,7 @@ Le menu pause est lui aussi possédé par Sanctuary. Il ne conserve que Retour a ## Versions du modpack et mises à jour Modrinth -`pack_version` dans `gradle.properties` est la version du pack complet. `mod_version=0.0.0-alpha.0` et `module_lifecycle=standby` sont les valeurs par défaut des modules en veille ; les propriétés `_version` et `_lifecycle` n’activent et ne font avancer que le module concerné. Le contrat de distribution est dans `pack/release.json`. Pour l’alpha.235, `zevent` reste temporairement dans les archives du pack et utilise Dream Displays pour la lecture native des flux Twitch. +`pack_version` dans `gradle.properties` est la version du pack complet. `mod_version=0.0.0-alpha.0` et `module_lifecycle=standby` sont les valeurs par défaut des modules en veille ; les propriétés `_version` et `_lifecycle` n’activent et ne font avancer que le module concerné. Le contrat de distribution est dans `pack/release.json`. Depuis l’alpha.236, Dream Displays fournit directement les écrans vidéo et le module temporaire `zevent` n’est plus construit ni distribué. La version globale du pack n’est pas injectée dans les JAR inchangés : leur contenu et leur numéro restent immuables. Le lanceur possède la composition exacte du pack, tandis que chaque manifest conserve la version effective de son module. diff --git a/build.gradle b/build.gradle index 3b72e41..ddbcecb 100644 --- a/build.gradle +++ b/build.gradle @@ -19,9 +19,8 @@ def moduleIds = [ "masterkey" ] -def eventModuleIds = ["zevent"] -def workspaceModuleIds = moduleIds + eventModuleIds -def distributedModuleIds = moduleIds + eventModuleIds +def workspaceModuleIds = moduleIds +def distributedModuleIds = moduleIds allprojects { group = rootProject.maven_group @@ -2922,7 +2921,7 @@ tasks.register("verifyNotchEncounter") { || rootProject.ouch_version != "0.0.0-alpha.11" || rootProject.sanctuary_version != "0.0.0-alpha.139" || rootProject.masterkey_version != "0.0.0-alpha.9" - || rootProject.pack_version != "26.2.0-alpha.235" + || rootProject.pack_version != "26.2.0-alpha.236" || manifests.itsalive.custom?.sanctuary26?.data_version != 4 || manifests.sanctuary.custom?.sanctuary26?.data_version != 15 || manifests.ouch.depends?.itsalive != ">=0.0.0-alpha.37" @@ -3011,7 +3010,7 @@ tasks.register("verifyMagicCarpet") { "iliketomoveit/src/main/resources/assets/iliketomoveit/models/item/magic_carpet.json")) def carpetTexture = file( "iliketomoveit/src/main/resources/assets/iliketomoveit/textures/item/magic_carpet.png") - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.iliketomoveit_version != "0.0.0-alpha.18" || rootProject.onlyfun_version != "0.0.0-alpha.27" || rootProject.sanctuary_version != "0.0.0-alpha.139" @@ -3644,7 +3643,7 @@ tasks.register("verifyProgressivePauseMenuRelease") { [(locale): new JsonSlurper().parse(file( "sanctuary/src/main/resources/assets/sanctuary/lang/${locale}.json"))] } - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.sanctuary_version != "0.0.0-alpha.139" || rootProject.onlyfun_version != "0.0.0-alpha.27" || release.pack_version != rootProject.pack_version || index.versionId != rootProject.pack_version @@ -3694,7 +3693,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.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.anotherworld_version != "0.0.0-alpha.58" || rootProject.redstoner_version != "0.0.0-alpha.20" || release.pack_version != rootProject.pack_version || index.versionId != rootProject.pack_version @@ -4676,7 +4675,7 @@ tasks.register("verifyShopPricingLayoutRelease") { "pack/migrations/26.2.0-alpha.192-shop-pricing-layout-to-alpha.193.json")) def release = new JsonSlurper().parse(file("pack/release.json")) def index = new JsonSlurper().parse(file("pack/prism/modrinth.index.json")) - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.onlyfun_version != "0.0.0-alpha.27" || rootProject.sanctuary_version != "0.0.0-alpha.139" || release.pack_version != rootProject.pack_version || index.versionId != rootProject.pack_version @@ -4721,7 +4720,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.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.itsalive_version != "0.0.0-alpha.38" || release.pack_version != rootProject.pack_version || index.versionId != rootProject.pack_version || migration.source?.pack_version != "26.2.0-alpha.193" @@ -4770,7 +4769,7 @@ tasks.register("verifyShopCsvBossGatesRelease") { def bossGate = file("onlyfun/src/main/java/fr/koka99cab/sanctuary26/onlyfun/shop/OnlyFunBossShopGate.java").text def catalog = file("onlyfun/src/main/java/fr/koka99cab/sanctuary26/onlyfun/shop/OnlyFunShopCatalog.java").text def offerCatalog = file("sanctuary/src/main/java/fr/koka99cab/sanctuary26/sanctuary/shop/ShopOfferCatalog.java").text - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.onlyfun_version != "0.0.0-alpha.27" || rootProject.sanctuary_version != "0.0.0-alpha.139" || release.pack_version != rootProject.pack_version || index.versionId != rootProject.pack_version @@ -4817,7 +4816,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.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || migration.source?.pack_version != "26.2.0-alpha.195" || migration.target?.pack_version != "26.2.0-alpha.196" || migration.target?.modules != [ @@ -4835,10 +4834,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.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" - || !packwiz.contains('version = "26.2.0-alpha.235"')) { + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" + || !packwiz.contains('version = "26.2.0-alpha.236"')) { throw new GradleException("The alpha.196 culinary, mailbox and grapple release contract is incomplete") } } @@ -4863,7 +4862,7 @@ tasks.register("verifyQuestRequestsCauldronBatchesRelease") { def prism = new JsonSlurper().parse(file("pack/prism/modrinth.index.json")) def packwiz = file("pack/packwiz/pack.toml").text def sanctuaryManifest = new JsonSlurper().parse(file("sanctuary/src/main/resources/fabric.mod.json")) - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.itsalive_version != "0.0.0-alpha.38" || rootProject.sanctuary_version != "0.0.0-alpha.139" || migration.source?.pack_version != "26.2.0-alpha.196" @@ -4883,10 +4882,10 @@ tasks.register("verifyQuestRequestsCauldronBatchesRelease") { || migration.distribution?.jei?.target != "30.26.0.186" || migration.compatibility?.sanctuary_target_network_protocol != 19 || sanctuaryManifest.custom?.sanctuary26?.network_protocol != 24 - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" - || !packwiz.contains('version = "26.2.0-alpha.235"')) { + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" + || !packwiz.contains('version = "26.2.0-alpha.236"')) { throw new GradleException("The alpha.197 quest-request and cauldron-batch release contract is incomplete") } } @@ -4913,7 +4912,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.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.itsalive_version != "0.0.0-alpha.38" || migration.source?.pack_version != "26.2.0-alpha.197" || migration.target?.pack_version != "26.2.0-alpha.198" @@ -4932,10 +4931,10 @@ tasks.register("verifyFermentationBarrelAutomationRelease") { || migration.distribution?.packwiz_index_refreshed != true || itsAliveManifest.custom?.sanctuary26?.data_version != 4 || itsAliveManifest.custom?.sanctuary26?.network_protocol != 4 - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" - || !packwiz.contains('version = "26.2.0-alpha.235"') + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwizIndex.contains('file = "mods/itsalive-0.0.0-alpha.38.jar"')) { throw new GradleException("The alpha.198 fermentation barrel release contract is incomplete") } @@ -4963,7 +4962,7 @@ tasks.register("verifyQuestRequestContractsRelease") { def packwiz = file("pack/packwiz/pack.toml").text def packwizIndex = file("pack/packwiz/index.toml").text def sanctuaryManifest = new JsonSlurper().parse(file("sanctuary/src/main/resources/fabric.mod.json")) - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.itsalive_version != "0.0.0-alpha.38" || rootProject.sanctuary_version != "0.0.0-alpha.139" || migration.source?.pack_version != "26.2.0-alpha.198" @@ -4977,10 +4976,10 @@ tasks.register("verifyQuestRequestContractsRelease") { || migration.quest_request_contracts?.chat_accept_revalidates_distance_owner_sign_and_claim != true || migration.compatibility?.sanctuary_target_network_protocol != 20 || sanctuaryManifest.custom?.sanctuary26?.network_protocol != 24 - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" - || !packwiz.contains('version = "26.2.0-alpha.235"') + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwizIndex.contains('file = "mods/itsalive-0.0.0-alpha.38.jar"') || !packwizIndex.contains('file = "mods/sanctuary-0.0.0-alpha.139.jar"')) { throw new GradleException("The alpha.199 quest-request contract release is incomplete") @@ -5018,7 +5017,7 @@ 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.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.ambiance_version != "0.0.0-alpha.22" || rootProject.ouch_version != "0.0.0-alpha.11" || migration.source?.pack_version != "26.2.0-alpha.199" @@ -5052,10 +5051,10 @@ tasks.register("verifyWeatherTntAmbianceRelease") { || !weatherTnt.contains("AmbianceDailyWeather.CLEAR") || !weatherTnt.contains("CLEAR_WEATHER_TICKS = 864_000") || weatherTnt.contains("setWeatherParameters") - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" - || !packwiz.contains('version = "26.2.0-alpha.235"') + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.22.jar"') || !packwizIndex.contains('file = "mods/ouch-0.0.0-alpha.11.jar"')) { throw new GradleException("The alpha.200 Weather TNT and Ambiance release is incomplete") @@ -5084,7 +5083,7 @@ tasks.register("verifyQuestRequestEscrowRelease") { def packwiz = file("pack/packwiz/pack.toml").text def packwizIndex = file("pack/packwiz/index.toml").text def sanctuaryManifest = new JsonSlurper().parse(file("sanctuary/src/main/resources/fabric.mod.json")) - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.sanctuary_version != "0.0.0-alpha.139" || migration.source?.pack_version != "26.2.0-alpha.200" || migration.source?.modules?.sanctuary != "0.0.0-alpha.115" @@ -5099,10 +5098,10 @@ tasks.register("verifyQuestRequestEscrowRelease") { || migration.compatibility?.sanctuary_target_network_protocol != 21 || sanctuaryManifest.custom?.sanctuary26?.data_version != 15 || sanctuaryManifest.custom?.sanctuary26?.network_protocol != 24 - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" - || !packwiz.contains('version = "26.2.0-alpha.235"') + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwizIndex.contains('file = "mods/sanctuary-0.0.0-alpha.139.jar"')) { throw new GradleException("The alpha.201 quest-request escrow release is incomplete") } @@ -5138,7 +5137,7 @@ tasks.register("verifyWaystoneShopCulinaryAlpha202Release") { "iliketomoveit/src/main/resources/fabric.mod.json")) def sanctuaryManifest = new JsonSlurper().parse(file( "sanctuary/src/main/resources/fabric.mod.json")) - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.anotherworld_version != "0.0.0-alpha.58" || rootProject.itsalive_version != "0.0.0-alpha.38" || rootProject.iliketomoveit_version != "0.0.0-alpha.18" @@ -5178,10 +5177,10 @@ tasks.register("verifyWaystoneShopCulinaryAlpha202Release") { || moveItManifest.custom?.sanctuary26?.network_protocol != 5 || sanctuaryManifest.custom?.sanctuary26?.data_version != 15 || sanctuaryManifest.custom?.sanctuary26?.network_protocol != 24 - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" - || !packwiz.contains('version = "26.2.0-alpha.235"') + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.58.jar"') || !packwizIndex.contains('file = "mods/itsalive-0.0.0-alpha.38.jar"') || !packwizIndex.contains('file = "mods/iliketomoveit-0.0.0-alpha.18.jar"') @@ -5298,7 +5297,7 @@ tasks.register("verifySafeVaultFeature") { def image = javax.imageio.ImageIO.read(file("anotherworld/src/main/resources/assets/anotherworld/textures/${path}")) image == null || image.width != size[0] || image.height != size[1] }.keySet() - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.anotherworld_version != "0.0.0-alpha.58" || rootProject.sanctuary_version != "0.0.0-alpha.139" || migration.schema_version != 1 @@ -5490,7 +5489,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.29.0.201.jar" } - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.anotherworld_version != "0.0.0-alpha.58" || migration.source?.pack_version != "26.2.0-alpha.202" || migration.source?.modules != [anotherworld: "0.0.0-alpha.50"] @@ -5508,9 +5507,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.235.mrpack" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" || prism.versionId != rootProject.pack_version - || !packwiz.contains('version = "26.2.0-alpha.235"') + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.58.jar"') || packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.50.jar"') || jeiFiles.size() != 1 @@ -5536,7 +5535,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.29.0.201.jar" } - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.anotherworld_version != "0.0.0-alpha.58" || migration.source?.pack_version != "26.2.0-alpha.203" || migration.source?.modules != [anotherworld: "0.0.0-alpha.51"] @@ -5562,9 +5561,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.235.mrpack" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" || prism.versionId != rootProject.pack_version - || !packwiz.contains('version = "26.2.0-alpha.235"') + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.58.jar"') || packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.51.jar"') || jeiFiles.size() != 1 @@ -5590,7 +5589,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.29.0.201.jar" } - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.anotherworld_version != "0.0.0-alpha.58" || migration.source?.pack_version != "26.2.0-alpha.204" || migration.source?.modules != [anotherworld: "0.0.0-alpha.52"] @@ -5619,9 +5618,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.235.mrpack" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" || prism.versionId != rootProject.pack_version - || !packwiz.contains('version = "26.2.0-alpha.235"') + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.58.jar"') || packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.52.jar"') || jeiFiles.size() != 1 @@ -5648,7 +5647,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.29.0.201.jar" } - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.anotherworld_version != "0.0.0-alpha.58" || migration.source?.pack_version != "26.2.0-alpha.205" || migration.source?.modules != [anotherworld: "0.0.0-alpha.53"] @@ -5671,9 +5670,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.235.mrpack" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" || prism.versionId != rootProject.pack_version - || !packwiz.contains('version = "26.2.0-alpha.235"') + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.58.jar"') || packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.53.jar"') || jeiFiles.size() != 1 @@ -5700,7 +5699,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.29.0.201.jar" } - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.anotherworld_version != "0.0.0-alpha.58" || migration.source?.pack_version != "26.2.0-alpha.206" || migration.source?.modules != [anotherworld: "0.0.0-alpha.54"] @@ -5730,9 +5729,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.235.mrpack" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" || prism.versionId != rootProject.pack_version - || !packwiz.contains('version = "26.2.0-alpha.235"') + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.58.jar"') || packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.54.jar"') || jeiFiles.size() != 1 @@ -5788,7 +5787,7 @@ 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.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.itsalive_version != "0.0.0-alpha.38" || rootProject.ambiance_version != "0.0.0-alpha.22" || migration.issue != 35 @@ -6040,7 +6039,7 @@ 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.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.ambiance_version != "0.0.0-alpha.22" || rootProject.itsalive_version != "0.0.0-alpha.38" || rootProject.onlyfun_version != "0.0.0-alpha.27" @@ -6088,9 +6087,9 @@ 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.235.mrpack" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" || prism.versionId != rootProject.pack_version - || !packwiz.contains('version = "26.2.0-alpha.235"') + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.22.jar"') || !packwizIndex.contains('file = "mods/itsalive-0.0.0-alpha.38.jar"') || !packwizIndex.contains('file = "mods/onlyfun-0.0.0-alpha.27.jar"') @@ -6159,7 +6158,7 @@ tasks.register("verifyAlpha210Release") { def jeiFiles = prism.files.findAll { it.path == "mods/jei-26.2-fabric-30.29.0.201.jar" } - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.sanctuary_version != "0.0.0-alpha.139" || rootProject.onlyfun_version != "0.0.0-alpha.27" || rootProject.iliketomoveit_version != "0.0.0-alpha.18" @@ -6205,10 +6204,10 @@ tasks.register("verifyAlpha210Release") { || manifests.iliketomoveit.custom?.sanctuary26?.network_protocol != 5 || manifests.itsalive.custom?.sanctuary26?.data_version != 4 || manifests.itsalive.custom?.sanctuary26?.network_protocol != 4 - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" - || !packwiz.contains('version = "26.2.0-alpha.235"') + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" + || !packwiz.contains('version = "26.2.0-alpha.236"') || requiredJars.any { !packwizIndex.contains(it) } || obsoleteJars.any { packwizIndex.contains(it) } || jeiFiles.size() != 1 @@ -6289,7 +6288,7 @@ tasks.register("verifyAlpha211Release") { def jeiFiles = prism.files.findAll { it.path == "mods/jei-26.2-fabric-30.29.0.201.jar" } - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || workspaceModules.any { id, version -> rootProject.property("${id}_version") != version } || migration.source?.pack_version != "26.2.0-alpha.210" || migration.source?.modules != expectedSource @@ -6317,9 +6316,9 @@ tasks.register("verifyAlpha211Release") { || migration.distribution?.prism_modrinth_index_updated != true || migration.distribution?.shared_client_server_mrpack != true || release.pack_version != rootProject.pack_version - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" || prism.versionId != rootProject.pack_version - || !packwiz.contains('version = "26.2.0-alpha.235"') + || !packwiz.contains('version = "26.2.0-alpha.236"') || requiredJars.any { !packwizIndex.contains(it) } || obsoleteJars.any { packwizIndex.contains(it) } || prism.files?.size() != 6 @@ -6327,7 +6326,7 @@ tasks.register("verifyAlpha211Release") { || jeiFiles[0].hashes?.sha1 != "e82447aff07e87a372cf817bc9c28b0d77b6f55c" || jeiFiles[0].hashes?.sha512 != "2279cb0ec4e41d9eebad80c2ecac76d19c8bc8e5aac69ba13f35b77494625c70d66edc74d59959116012bfb2f464b55806dd69fbf6387f25679b1553953e329a" || !changelog.contains("## `26.2.0-alpha.211`") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.235`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**")) { throw new GradleException("The alpha.211 Abjection and gameplay-polish release is incomplete") } } @@ -6361,7 +6360,7 @@ tasks.register("verifyAlpha212Release") { def jeiFiles = prism.files.findAll { it.path == "mods/jei-26.2-fabric-30.29.0.201.jar" } - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.sanctuary_version != "0.0.0-alpha.139" || migration.source?.pack_version != "26.2.0-alpha.211" || migration.source?.modules != [sanctuary: "0.0.0-alpha.119"] @@ -6383,16 +6382,16 @@ tasks.register("verifyAlpha212Release") { || manifest.custom?.sanctuary26?.data_version != 15 || manifest.custom?.sanctuary26?.network_protocol != 24 || !minecraftMixin.contains('method = "pickBlockOrEntity"') - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" || prism.files?.size() != 6 || jeiFiles.size() != 1 - || !packwiz.contains('version = "26.2.0-alpha.235"') + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwizIndex.contains('file = "mods/sanctuary-0.0.0-alpha.139.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.235`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**")) { throw new GradleException("The alpha.212 Black Market startup-fix release is incomplete") } } @@ -6426,7 +6425,7 @@ tasks.register("verifyAlpha213Release") { def jeiFiles = prism.files.findAll { it.path == "mods/jei-26.2-fabric-30.29.0.201.jar" } - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.ambiance_version != "0.0.0-alpha.22" || migration.source?.pack_version != "26.2.0-alpha.212" || migration.source?.modules != [ambiance: "0.0.0-alpha.15"] @@ -6450,16 +6449,16 @@ tasks.register("verifyAlpha213Release") { || manifest.custom?.sanctuary26?.network_protocol != 6 || !levelEventMixin.contains('@Mixin(LevelEventHandler.class)') || !levelEventMixin.contains('@Inject(method = "levelEvent"') - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" || prism.files?.size() != 6 || jeiFiles.size() != 1 - || !packwiz.contains('version = "26.2.0-alpha.235"') + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.22.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.235`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**")) { throw new GradleException("The alpha.213 Ambiance startup-fix release is incomplete") } } @@ -6494,7 +6493,7 @@ tasks.register("verifyAlpha214Release") { "ambiance/src/main/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscAudioPlayer.java").text def urlSmoke = file( "ambiance/src/test/java/fr/koka99cab/sanctuary26/ambiance/white_disc/WhiteDiscUrlSmoke.java").text - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.ambiance_version != "0.0.0-alpha.22" || migration.source?.pack_version != "26.2.0-alpha.213" || migration.source?.modules != [ambiance: "0.0.0-alpha.16"] @@ -6523,16 +6522,16 @@ tasks.register("verifyAlpha214Release") { || !audioPlayer.contains('message.ambiance.white_disc.loading') || !audioPlayer.contains('message.ambiance.white_disc.failed') || !urlSmoke.contains("https://youtu.be/Ue5ZBe-GzSM?si=78LSbtBQzUYzhA2Y") - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" || prism.files?.size() != 6 - || !packwiz.contains('version = "26.2.0-alpha.235"') + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.22.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.235`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**")) { throw new GradleException("The alpha.214 white-disc solo synchronization release is incomplete") } } @@ -6573,7 +6572,7 @@ tasks.register("verifyAlpha215Release") { "ambiance/src/main/java/fr/koka99cab/sanctuary26/ambiance/client/audio/LavaplayerAudioStream.java").text def playbackSmoke = file( "ambiance/src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscPlaybackSmoke.java").text - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.ambiance_version != "0.0.0-alpha.22" || migration.source?.pack_version != "26.2.0-alpha.214" || migration.source?.modules != [ambiance: "0.0.0-alpha.17"] @@ -6613,16 +6612,16 @@ tasks.register("verifyAlpha215Release") { || !playbackSmoke.contains("https://www.youtube.com/watch?v=Ue5ZBe-GzSM") || !playbackSmoke.contains("stream.paddedSilenceBytes() != 0L") || !playbackSmoke.contains("stream.decodedTimelineMillis() != 4_000L") - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" || prism.files?.size() != 6 - || !packwiz.contains('version = "26.2.0-alpha.235"') + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.22.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.235`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**")) { throw new GradleException("The alpha.215 resilient white-disc playback release is incomplete") } } @@ -6667,7 +6666,7 @@ tasks.register("verifyAlpha216Release") { "ambiance/src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/LavaplayerAudioStreamSmoke.java").text def playbackSmoke = file( "ambiance/src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscPlaybackSmoke.java").text - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.ambiance_version != "0.0.0-alpha.22" || migration.source?.pack_version != "26.2.0-alpha.215" || migration.source?.modules != [ambiance: "0.0.0-alpha.18"] @@ -6711,16 +6710,16 @@ tasks.register("verifyAlpha216Release") { || !playbackSmoke.contains("stream.paddedSilenceBytes() != 0L") || !playbackSmoke.contains("stream.decodedTimelineMillis() != 4_000L") || !playbackSmoke.contains("LavaplayerAudioStream.SAMPLE_RATE * 2 * 4") - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" || prism.files?.size() != 6 - || !packwiz.contains('version = "26.2.0-alpha.235"') + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.22.jar"') || packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.18.jar"') || !changelog.contains("## `26.2.0-alpha.216`") || changelog.contains("## Modifications non distribuées") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.235`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**")) { throw new GradleException("The alpha.216 white-disc audio-quality release is incomplete") } } @@ -6755,7 +6754,7 @@ tasks.register("verifyAlpha217Release") { "ambiance/src/main/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscAudioPlayer.java").text def streamSmoke = file( "ambiance/src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/LavaplayerAudioStreamSmoke.java").text - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.ambiance_version != "0.0.0-alpha.22" || migration.source?.pack_version != "26.2.0-alpha.216" || migration.source?.modules != [ambiance: "0.0.0-alpha.19"] @@ -6786,16 +6785,16 @@ tasks.register("verifyAlpha217Release") { || !audioPlayer.contains("PLAYBACK_PITCH = 1.0F") || audioPlayer.count("channel.setPitch(PLAYBACK_PITCH)") != 2 || !streamSmoke.contains("WhiteDiscAudioPlayer.PLAYBACK_PITCH - 1.0F") - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" || prism.files?.size() != 6 - || !packwiz.contains('version = "26.2.0-alpha.235"') + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.22.jar"') || packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.19.jar"') || !changelog.contains("## `26.2.0-alpha.217`") || changelog.contains("## Modifications non distribuées") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.235`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**")) { throw new GradleException("The alpha.217 white-disc pitch release is incomplete") } } @@ -6852,7 +6851,7 @@ tasks.register("verifyAlpha218Release") { def obsoleteJars = sourceModules.collect { id, version -> "file = \"mods/${id}-${version}.jar\"" } - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.redstoner_version != "0.0.0-alpha.20" || currentModules.findAll { id, version -> id != "redstoner" && id != "sanctuary" && id != "onlyfun" && id != "iliketomoveit" @@ -6893,13 +6892,13 @@ tasks.register("verifyAlpha218Release") { || !onlyFunPolicy.contains('namespace.equals("redstoner") && path.equals("storage_terminal")') || !blackMarketPolicy.contains('namespace.equals("redstoner") && path.equals("storage_terminal")') || release.pack_version != rootProject.pack_version - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" || prism.versionId != rootProject.pack_version - || !packwiz.contains('version = "26.2.0-alpha.235"') + || !packwiz.contains('version = "26.2.0-alpha.236"') || requiredJars.any { !packwizIndex.contains(it) } || obsoleteJars.any { packwizIndex.contains(it) } || !changelog.contains("## `26.2.0-alpha.218`") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.235`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**")) { throw new GradleException("The alpha.218 Storage Terminal release is incomplete") } } @@ -6962,7 +6961,7 @@ tasks.register("verifyAlpha219Release") { include "**/*golden*days*.zip", "**/*golden*days*.jar" exclude "**/build/**", "**/.gradle/**", "**/.git/**" }.files - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || workspaceModules.any { id, version -> rootProject.property("${id}_version") != version } || migration.source?.pack_version != "26.2.0-alpha.218" || migration.source?.modules != sourceModules @@ -6994,15 +6993,15 @@ tasks.register("verifyAlpha219Release") { || manifests.ambiance.custom?.sanctuary26?.data_version != 2 || manifests.ambiance.custom?.sanctuary26?.network_protocol != 6 || release.pack_version != rootProject.pack_version - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" || prism.versionId != rootProject.pack_version || prism.files.any { it.path.toLowerCase().contains("golden-days") } - || !packwiz.contains('version = "26.2.0-alpha.235"') + || !packwiz.contains('version = "26.2.0-alpha.236"') || requiredJars.any { !packwizIndex.contains(it) } || obsoleteJars.any { packwizIndex.contains(it) } || !forbiddenGoldenArchives.isEmpty() || !changelog.contains("## `26.2.0-alpha.219`") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.235`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**")) { throw new GradleException("The alpha.219 finite Alpha/Indev release is incomplete") } } @@ -7041,7 +7040,7 @@ tasks.register("verifyAlpha220Release") { "redstoner/src/main/java/fr/koka99cab/sanctuary26/redstoner/client/gui/StorageTerminalScreen.java").text def networking = file( "redstoner/src/main/java/fr/koka99cab/sanctuary26/redstoner/network/RedStonerNetworking.java").text - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.redstoner_version != "0.0.0-alpha.20" || migration.source?.pack_version != "26.2.0-alpha.219" || migration.source?.modules != [redstoner: "0.0.0-alpha.11"] @@ -7082,13 +7081,13 @@ tasks.register("verifyAlpha220Release") { || networking.contains("storage_terminal_snapshot") || networking.contains("storage_terminal_action") || release.pack_version != rootProject.pack_version - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" || prism.versionId != rootProject.pack_version - || !packwiz.contains('version = "26.2.0-alpha.235"') + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwizIndex.contains('file = "mods/redstoner-0.0.0-alpha.20.jar"') || packwizIndex.contains('file = "mods/redstoner-0.0.0-alpha.11.jar"') || !changelog.contains("## `26.2.0-alpha.220`") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.235`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**")) { throw new GradleException("The alpha.220 Storage Terminal menu release is incomplete") } } @@ -7136,7 +7135,7 @@ tasks.register("verifyAlpha221Release") { def playbackSmoke = file( "ambiance/src/test/java/fr/koka99cab/sanctuary26/ambiance/client/audio/WhiteDiscPlaybackSmoke.java").text def contract = migration.white_disc_native_rate - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.ambiance_version != "0.0.0-alpha.22" || migration.source?.pack_version != "26.2.0-alpha.220" || migration.source?.modules != [ambiance: "0.0.0-alpha.21"] @@ -7185,13 +7184,13 @@ tasks.register("verifyAlpha221Release") { || !playbackSmoke.contains("PCM cadence: 100%% speed") || !whiteDiscDocumentation.contains("48 000 Hz") || release.pack_version != rootProject.pack_version - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" || prism.versionId != rootProject.pack_version - || !packwiz.contains('version = "26.2.0-alpha.235"') + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.22.jar"') || packwizIndex.contains('file = "mods/ambiance-0.0.0-alpha.21.jar"') || !changelog.contains("## `26.2.0-alpha.221`") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.235`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**")) { throw new GradleException("The alpha.221 native-rate white-disc release is incomplete") } } @@ -7270,7 +7269,7 @@ tasks.register("verifyAlpha222Release") { def jeiFiles = prism.files.findAll { it.path == "mods/jei-26.2-fabric-30.29.0.201.jar" } - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.redstoner_version != "0.0.0-alpha.20" || rootProject.sanctuary_version != "0.0.0-alpha.139" || migration.source?.pack_version != "26.2.0-alpha.221" @@ -7344,10 +7343,10 @@ tasks.register("verifyAlpha222Release") { || !questEditor.contains("QuestIdSuggestions.suggest") || !suggestions.contains("Normalizer.Form.NFD") || !suggestions.contains("public static final int LIMIT = 5") - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" - || !packwiz.contains('version = "26.2.0-alpha.235"') + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwizIndex.contains('file = "mods/redstoner-0.0.0-alpha.20.jar"') || !packwizIndex.contains('file = "mods/sanctuary-0.0.0-alpha.139.jar"') || packwizIndex.contains('file = "mods/redstoner-0.0.0-alpha.12.jar"') @@ -7358,7 +7357,7 @@ tasks.register("verifyAlpha222Release") { || jeiFiles[0].hashes?.sha1 != "e82447aff07e87a372cf817bc9c28b0d77b6f55c" || jeiFiles[0].hashes?.sha512 != "2279cb0ec4e41d9eebad80c2ecac76d19c8bc8e5aac69ba13f35b77494625c70d66edc74d59959116012bfb2f464b55806dd69fbf6387f25679b1553953e329a" || !changelog.contains("## `26.2.0-alpha.222`") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.235`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**")) { throw new GradleException("The alpha.222 terminal-search and quest-tracker release is incomplete") } } @@ -7489,7 +7488,7 @@ tasks.register("verifyAlpha223Release") { def jeiFiles = prism.files.findAll { it.path == "mods/jei-26.2-fabric-30.29.0.201.jar" } - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.sanctuary_version != "0.0.0-alpha.139" || migration.source?.pack_version != "26.2.0-alpha.222" || migration.source?.modules != [sanctuary: "0.0.0-alpha.124"] @@ -7554,10 +7553,10 @@ tasks.register("verifyAlpha223Release") { || !questSync.contains("case EMERALD -> 2") || !inventorySmoke.contains("Hotbar snapshot must remain untouched") || !displaySmoke.contains("QuestTrackerDisplayMode.PANEL.next()") - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" - || !packwiz.contains('version = "26.2.0-alpha.235"') + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwizIndex.contains('file = "mods/sanctuary-0.0.0-alpha.139.jar"') || packwizIndex.contains('file = "mods/sanctuary-0.0.0-alpha.124.jar"') || !packwizJei.contains('filename = "jei-26.2-fabric-30.29.0.201.jar"') @@ -7566,7 +7565,7 @@ tasks.register("verifyAlpha223Release") { || jeiFiles[0].hashes?.sha1 != "e82447aff07e87a372cf817bc9c28b0d77b6f55c" || jeiFiles[0].hashes?.sha512 != "2279cb0ec4e41d9eebad80c2ecac76d19c8bc8e5aac69ba13f35b77494625c70d66edc74d59959116012bfb2f464b55806dd69fbf6387f25679b1553953e329a" || !changelog.contains("## `26.2.0-alpha.223`") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.235`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**")) { throw new GradleException("The alpha.223 inventory-sort and quest-tracker display release is incomplete") } } @@ -7630,7 +7629,7 @@ tasks.register("verifyAlpha224Release") { }.collect { id, version -> "file = \"mods/${id}-${version}.jar\"" } - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || workspaceModules.any { id, version -> rootProject.property("${id}_version") != version } || migration.status != "released" || migration.source?.pack_version != "26.2.0-alpha.223" @@ -7673,14 +7672,14 @@ tasks.register("verifyAlpha224Release") { || !sortPayload.contains("buffer.writeBoolean(container)") || !sortPayload.contains("buffer.readBoolean()") || !networking.contains("PROTOCOL_VERSION = 24") - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" - || !packwiz.contains('version = "26.2.0-alpha.235"') + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" + || !packwiz.contains('version = "26.2.0-alpha.236"') || requiredJars.any { !packwizIndex.contains(it) } || obsoleteJars.any { packwizIndex.contains(it) } || !changelog.contains("## `26.2.0-alpha.224`") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.235`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**")) { throw new GradleException("The alpha.224 Notch, Magic Carpet and container-sort release is incomplete") } } @@ -7775,7 +7774,7 @@ tasks.register("verifyAlpha225Release") { "iliketomoveit/src/main/resources/assets/iliketomoveit/textures/item/magic_carpet.png") def carpetTextureHash = MessageDigest.getInstance("SHA-256") .digest(carpetTexture.bytes).encodeHex().toString() - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || currentWorkspaceModules.any { id, version -> rootProject.property("${id}_version") != version } || migration.status != "released" || migration.source?.pack_version != "26.2.0-alpha.224" @@ -7828,14 +7827,14 @@ tasks.register("verifyAlpha225Release") { || !lootboxes.contains("SanctuaryEntityPolicy.isTemporaryCompanion") || carpetModel.textures?.layer0 != "iliketomoveit:item/magic_carpet" || carpetTextureHash != "3e4527d24a37f0632b27d2c857b047c581db07eaa41befaffbf28043a8ed86cc" - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" - || !packwiz.contains('version = "26.2.0-alpha.235"') + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" + || !packwiz.contains('version = "26.2.0-alpha.236"') || requiredJars.any { !packwizIndex.contains(it) } || obsoleteJars.any { packwizIndex.contains(it) } || !changelog.contains("## `26.2.0-alpha.225`") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.235`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**")) { throw new GradleException("The alpha.225 four-ticket bug-fix release is incomplete") } } @@ -7901,7 +7900,7 @@ tasks.register("verifyAlpha226Release") { def requiredJars = releasedModules.collect { id, version -> "file = \"mods/${id}-${version}.jar\"" } - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.sanctuary_version != "0.0.0-alpha.139" || migration.status != "released" || migration.source?.pack_version != "26.2.0-alpha.225" @@ -7944,14 +7943,14 @@ tasks.register("verifyAlpha226Release") { || !renderer.contains("LivingEntityRenderLayerRegistrationCallback") || !avatarMixin.contains("appearance.bannerCape()") || onlyFun.contains('"white_cape"') - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" - || !packwiz.contains('version = "26.2.0-alpha.235"') + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" + || !packwiz.contains('version = "26.2.0-alpha.236"') || requiredJars.any { !packwizIndex.contains(it) } || packwizIndex.contains('file = "mods/sanctuary-0.0.0-alpha.129.jar"') || !changelog.contains("## `26.2.0-alpha.226`") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.235`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**")) { throw new GradleException("The alpha.226 craftable banner cape release is incomplete") } } @@ -7992,7 +7991,7 @@ tasks.register("verifyAlpha227Release") { def requiredJars = releasedModules.collect { id, version -> "file = \"mods/${id}-${version}.jar\"" } - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.anotherworld_version != "0.0.0-alpha.58" || rootProject.sanctuary_version != "0.0.0-alpha.139" || migration.status != "released" @@ -8032,15 +8031,15 @@ tasks.register("verifyAlpha227Release") { || anotherWorldManifest.custom?.sanctuary26?.network_protocol != 2 || sanctuaryManifest.custom?.sanctuary26?.data_version != 15 || sanctuaryManifest.custom?.sanctuary26?.network_protocol != 24 - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" - || !packwiz.contains('version = "26.2.0-alpha.235"') + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" + || !packwiz.contains('version = "26.2.0-alpha.236"') || requiredJars.any { !packwizIndex.contains(it) } || packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.56.jar"') || packwizIndex.contains('file = "mods/sanctuary-0.0.0-alpha.130.jar"') || !changelog.contains("## `26.2.0-alpha.227`") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.235`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**")) { throw new GradleException("The alpha.227 persistent Backroom release is incomplete") } } @@ -8090,7 +8089,7 @@ tasks.register("verifyAlpha228Release") { def requiredJars = releasedModules.collect { id, version -> "file = \"mods/${id}-${version}.jar\"" } - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.redstoner_version != "0.0.0-alpha.20" || rootProject.sanctuary_version != "0.0.0-alpha.139" || migration.status != "released" @@ -8137,15 +8136,15 @@ tasks.register("verifyAlpha228Release") { || !backroomLayout.contains("WORLD_MAX_Y_EXCLUSIVE = 384") || !backroomLayout.contains("LEVEL_4(-64, 27)") || !backroomLayout.contains("mazeConnected") - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" - || !packwiz.contains('version = "26.2.0-alpha.235"') + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" + || !packwiz.contains('version = "26.2.0-alpha.236"') || requiredJars.any { !packwizIndex.contains(it) } || packwizIndex.contains('file = "mods/redstoner-0.0.0-alpha.13.jar"') || packwizIndex.contains('file = "mods/sanctuary-0.0.0-alpha.131.jar"') || !changelog.contains("## `26.2.0-alpha.228`") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.235`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**")) { throw new GradleException("The alpha.228 five-level Backroom and terminal release is incomplete") } } @@ -8200,7 +8199,7 @@ tasks.register("verifyAlpha229Release") { "screen.redstoner.storage_terminal.sort.alphabetical", "screen.redstoner.storage_terminal.sort.count_ascending", "screen.redstoner.storage_terminal.sort.count_descending"] - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.redstoner_version != "0.0.0-alpha.20" || rootProject.sanctuary_version != "0.0.0-alpha.139" || migration.status != "released" @@ -8238,14 +8237,14 @@ tasks.register("verifyAlpha229Release") { || !screen.contains("sortMode = sortMode.next()") || !smoke.contains("verifySorting()") || !smoke.contains("periodic quantity refresh") - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" - || !packwiz.contains('version = "26.2.0-alpha.235"') + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" + || !packwiz.contains('version = "26.2.0-alpha.236"') || requiredJars.any { !packwizIndex.contains(it) } || packwizIndex.contains('file = "mods/redstoner-0.0.0-alpha.15.jar"') || !changelog.contains("## `26.2.0-alpha.229`") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.235`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**")) { throw new GradleException("The alpha.229 storage-terminal sorting release is incomplete") } } @@ -8285,7 +8284,7 @@ tasks.register("verifyAlpha230Release") { } def indexHash = java.security.MessageDigest.getInstance("SHA-256") .digest(packwizIndexFile.bytes).encodeHex().toString() - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.sanctuary_version != "0.0.0-alpha.139" || rootProject.redstoner_version != "0.0.0-alpha.20" || migration.schema_version != 1 @@ -8320,10 +8319,10 @@ tasks.register("verifyAlpha230Release") { || manifests.sanctuary.custom?.sanctuary26?.network_protocol != 24 || manifests.redstoner.custom?.sanctuary26?.data_version != 5 || manifests.redstoner.custom?.sanctuary26?.network_protocol != 9 - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" - || !packwiz.contains('version = "26.2.0-alpha.235"') + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwiz.contains("hash = \"${indexHash}\"") || requiredJars.any { !packwizIndex.contains(it) } || !packwizIndex.contains('file = "mods/sanctuary-0.0.0-alpha.139.jar"\nhash = "22a37980bd7b121cbfe65e853a6c6a9f8549bbf4af9b4fdd5f22dbd04df273b0"') @@ -8331,7 +8330,7 @@ tasks.register("verifyAlpha230Release") { || packwizIndex.contains('file = "mods/sanctuary-0.0.0-alpha.132.jar"') || packwizIndex.contains('file = "mods/redstoner-0.0.0-alpha.16.jar"') || !changelog.contains("## `26.2.0-alpha.230`") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.235`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**")) { throw new GradleException("The alpha.230 Sanctuary polish release is incomplete") } } @@ -8391,7 +8390,7 @@ tasks.register("verifyAlpha231Release") { } def indexHash = java.security.MessageDigest.getInstance("SHA-256") .digest(packwizIndexFile.bytes).encodeHex().toString() - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.sanctuary_version != "0.0.0-alpha.139" || rootProject.redstoner_version != "0.0.0-alpha.20" || migration.schema_version != 1 @@ -8455,10 +8454,10 @@ tasks.register("verifyAlpha231Release") { || jeiFiles[0].hashes?.sha512 != "2279cb0ec4e41d9eebad80c2ecac76d19c8bc8e5aac69ba13f35b77494625c70d66edc74d59959116012bfb2f464b55806dd69fbf6387f25679b1553953e329a" || jeiFiles[0].fileSize != 1_860_103 || !packwizJei.contains('filename = "jei-26.2-fabric-30.29.0.201.jar"') - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" - || !packwiz.contains('version = "26.2.0-alpha.235"') + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwiz.contains("hash = \"${indexHash}\"") || requiredJars.any { !packwizIndex.contains(it) } || !packwizIndex.contains('file = "mods/sanctuary-0.0.0-alpha.139.jar"\nhash = "22a37980bd7b121cbfe65e853a6c6a9f8549bbf4af9b4fdd5f22dbd04df273b0"') @@ -8467,7 +8466,7 @@ tasks.register("verifyAlpha231Release") { || packwizIndex.contains('file = "mods/redstoner-0.0.0-alpha.17.jar"') || !changelog.contains("## `26.2.0-alpha.231`") || !readme.contains("Red-Stoner **`0.0.0-alpha.20`**") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.235`**")) { + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**")) { throw new GradleException("The alpha.231 Backroom and trophy-panel release is incomplete") } } @@ -8535,7 +8534,7 @@ tasks.register("verifyAlpha232Release") { } def indexHash = MessageDigest.getInstance("SHA-256") .digest(packwizIndexFile.bytes).encodeHex().toString() - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.anotherworld_version != "0.0.0-alpha.58" || rootProject.sanctuary_version != "0.0.0-alpha.139" || rootProject.redstoner_version != "0.0.0-alpha.20" @@ -8594,10 +8593,10 @@ tasks.register("verifyAlpha232Release") { !lang.containsKey("message.canon.camera.screenshot_saved") || !lang.containsKey("message.canon.camera.screenshot_failed") } - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" - || !packwiz.contains('version = "26.2.0-alpha.235"') + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwiz.contains("hash = \"${indexHash}\"") || requiredJars.any { !packwizIndex.contains(it) } || !packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.58.jar"\nhash = "8936b0a5bf3f122afc752cba5e8d96ac92cfb1458785c3fac13d25f51cb4814c"') @@ -8608,7 +8607,7 @@ tasks.register("verifyAlpha232Release") { || packwizIndex.contains('file = "mods/redstoner-0.0.0-alpha.18.jar"') || !changelog.contains("## `26.2.0-alpha.232`") || !changelog.contains("ticket #146") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.235`**") + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**") || !readme.contains("Another World **`0.0.0-alpha.58`**")) { throw new GradleException("The alpha.232 Canon screenshot and alpha.231 follow-up release is incomplete") } @@ -8649,7 +8648,7 @@ tasks.register("verifyAlpha233Release") { } def indexHash = MessageDigest.getInstance("SHA-256") .digest(packwizIndexFile.bytes).encodeHex().toString() - if (rootProject.pack_version != "26.2.0-alpha.235" + if (rootProject.pack_version != "26.2.0-alpha.236" || rootProject.sanctuary_version != "0.0.0-alpha.139" || rootProject.redstoner_version != "0.0.0-alpha.20" || migration.schema_version != 1 @@ -8681,10 +8680,10 @@ tasks.register("verifyAlpha233Release") { || manifests.sanctuary.custom?.sanctuary26?.network_protocol != 24 || manifests.redstoner.custom?.sanctuary26?.data_version != 5 || manifests.redstoner.custom?.sanctuary26?.network_protocol != 9 - || release.pack_version != "26.2.0-alpha.235" - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" - || prism.versionId != "26.2.0-alpha.235" - || !packwiz.contains('version = "26.2.0-alpha.235"') + || release.pack_version != "26.2.0-alpha.236" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" + || prism.versionId != "26.2.0-alpha.236" + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwiz.contains("hash = \"${indexHash}\"") || requiredJars.any { !packwizIndex.contains(it) } || !packwizIndex.contains('file = "mods/anotherworld-0.0.0-alpha.58.jar"\nhash = "8936b0a5bf3f122afc752cba5e8d96ac92cfb1458785c3fac13d25f51cb4814c"') @@ -8693,17 +8692,17 @@ tasks.register("verifyAlpha233Release") { || packwizIndex.contains('file = "mods/sanctuary-0.0.0-alpha.138.jar"') || packwizIndex.contains('file = "mods/redstoner-0.0.0-alpha.19.jar"') || !changelog.contains("## `26.2.0-alpha.233`") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.235`**") + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**") || !readme.contains("véritable panneau Vanilla en chêne pâle")) { throw new GradleException("The alpha.233 vanilla trophy-sign release is incomplete") } } } -tasks.register("verifyAlpha235Release") { +tasks.register("verifyAlpha236Release") { group = "verification" - description = "Checks the Sanctuary 26.2.0-alpha.235 native Twitch playback release." - inputs.file(file("pack/migrations/26.2.0-alpha.234-twitch-native-playback-to-alpha.235.json")) + description = "Checks the Sanctuary 26.2.0-alpha.236 ZEVENT removal release." + inputs.file(file("pack/migrations/26.2.0-alpha.235-remove-zevent-to-alpha.236.json")) inputs.file(file("pack/release.json")) inputs.file(file("pack/prism/modrinth.index.json")) inputs.file(file("pack/packwiz/pack.toml")) @@ -8711,10 +8710,9 @@ tasks.register("verifyAlpha235Release") { inputs.file(file("pack/packwiz/mods/dreamdisplays.pw.toml")) inputs.file(file("CHANGELOG.md")) inputs.file(file("README.md")) - inputs.file(file("zevent/src/main/resources/fabric.mod.json")) doLast { def migration = new JsonSlurper().parse(file( - "pack/migrations/26.2.0-alpha.234-twitch-native-playback-to-alpha.235.json")) + "pack/migrations/26.2.0-alpha.235-remove-zevent-to-alpha.236.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 @@ -8723,58 +8721,51 @@ tasks.register("verifyAlpha235Release") { def dreamMetafile = file("pack/packwiz/mods/dreamdisplays.pw.toml").text def changelog = file("CHANGELOG.md").text def readme = file("README.md").text - def manifest = new JsonSlurper().parse(file("zevent/src/main/resources/fabric.mod.json")) def requiredJars = distributedModuleIds.collect { id -> "file = \"mods/${id}-${project(":${id}").version}.jar\"" } def indexHash = MessageDigest.getInstance("SHA-256") .digest(packwizIndexFile.bytes).encodeHex().toString() - def zeventJar = file("pack/packwiz/mods/zevent-${rootProject.zevent_version}.jar") - def zeventHash = zeventJar.isFile() - ? MessageDigest.getInstance("SHA-256").digest(zeventJar.bytes).encodeHex().toString() - : "missing" def dreamFiles = prism.files.findAll { it.path == "mods/dreamdisplays-fabric-26.2-1.9.6.jar" } - if (rootProject.pack_version != "26.2.0-alpha.235" - || rootProject.zevent_version != "0.0.0-alpha.3" + if (rootProject.pack_version != "26.2.0-alpha.236" + || rootProject.findProperty("zevent_version") != null + || rootProject.findProperty("zevent_lifecycle") != null + || file("zevent/build.gradle").exists() + || file("settings.gradle").text.contains('"zevent"') || migration.schema_version != 1 || migration.status != "released" - || migration.released_in != "26.2.0-alpha.235" - || migration.temporary_until != "2026-09-07" - || migration.pack?.source_version != "26.2.0-alpha.234" - || migration.pack?.target_version != "26.2.0-alpha.235" - || migration.modules?.zevent?.source_module_version != "0.0.0-alpha.2" - || migration.modules?.zevent?.target_module_version != "0.0.0-alpha.3" - || migration.modules?.zevent?.data_version != 1 - || migration.modules?.zevent?.network_protocol != 1 - || migration.playback?.mcef_removed != true - || migration.playback?.native_hls_decoder != true - || migration.playback?.h264_video != true - || migration.playback?.aac_audio != true - || migration.playback?.maximum_quality_height != 720 - || migration.playback?.automatic_retry_seconds != 30 - || migration.playback?.offline_feedback != true - || migration.dependencies?.dream_displays?.version != "1.9.6" - || migration.dependencies?.dream_displays?.modrinth_project_id != "4IIKQyBu" - || migration.dependencies?.dream_displays?.modrinth_version_id != "GxyW2ksW" - || migration.dependencies?.dream_displays?.environment != "client_and_server" - || migration.compatibility?.existing_saves_supported != true - || migration.compatibility?.save_reset_required != false + || migration.released_in != "26.2.0-alpha.236" + || migration.pack?.source_version != "26.2.0-alpha.235" + || migration.pack?.target_version != "26.2.0-alpha.236" + || migration.removed_module?.id != "zevent" + || migration.removed_module?.source_module_version != "0.0.0-alpha.3" + || migration.removed_module?.target_module_version != null + || migration.removed_module?.source_directory_removed != true + || migration.removed_module?.client_jar_removed != true + || migration.removed_module?.server_jar_removed != true + || migration.removed_module?.registry_ids_removed != ["zevent:zevent_screen"] + || migration.replacement?.module != "dreamdisplays" + || migration.replacement?.version != "1.9.6" + || migration.replacement?.modrinth_project_id != "4IIKQyBu" + || migration.replacement?.modrinth_version_id != "GxyW2ksW" + || migration.replacement?.client_and_server_required != true + || migration.replacement?.automatic_screen_conversion != false + || migration.compatibility?.world_reset_required != false + || migration.compatibility?.world_backup_recommended != true + || migration.compatibility?.existing_zevent_screens_must_be_replaced != true + || migration.compatibility?.remaining_module_data_preserved != true + || migration.compatibility?.remaining_network_protocols_changed != false + || migration.compatibility?.client_and_server_must_remove_zevent != true || migration.distribution?.packwiz_index_refreshed != true || migration.distribution?.prism_modrinth_index_updated != true - || migration.distribution?.mcef_removed != true + || migration.distribution?.zevent_jar_absent != true || migration.distribution?.dream_displays_required != true - || manifest.id != "zevent" - || manifest.environment != "*" - || manifest.custom?.sanctuary26?.data_version != 1 - || manifest.custom?.sanctuary26?.network_protocol != 1 - || manifest.custom?.sanctuary26?.distribution != "temporary-weekend-pack-module" - || manifest.depends?.dreamdisplays != ">=1.9.6" - || manifest.depends?.containsKey("mcef-modern") - || manifest.suggests?.containsKey("mcef-modern") + || migration.distribution?.distributed_module_count != 10 + || distributedModuleIds.size() != 10 || release.pack_version != rootProject.pack_version - || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.235.mrpack" + || release.modrinth?.primary_file != "sanctuary-26.2.0-alpha.236.mrpack" || prism.versionId != rootProject.pack_version || prism.files?.size() != 6 || dreamFiles.size() != 1 @@ -8787,16 +8778,17 @@ tasks.register("verifyAlpha235Release") { || !dreamMetafile.contains('pin = true') || !dreamMetafile.contains('mod-id = "4IIKQyBu"') || !dreamMetafile.contains('version = "GxyW2ksW"') - || !packwiz.contains('version = "26.2.0-alpha.235"') + || !packwiz.contains('version = "26.2.0-alpha.236"') || !packwiz.contains("hash = \"${indexHash}\"") || requiredJars.any { !packwizIndex.contains(it) } || packwizIndex.contains('file = "mods/mcef-modern.pw.toml"') || !packwizIndex.contains('file = "mods/dreamdisplays.pw.toml"') - || !packwizIndex.contains("file = \"mods/zevent-0.0.0-alpha.3.jar\"\nhash = \"${zeventHash}\"") - || !changelog.contains("## `26.2.0-alpha.235`") - || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.235`**") - || !readme.contains("Dream Displays **`1.9.6`**")) { - throw new GradleException("The alpha.235 native Twitch playback release is incomplete") + || packwizIndex.contains("zevent-") + || !changelog.contains("## `26.2.0-alpha.236`") + || !readme.contains("Version courante du pack distribué : **`26.2.0-alpha.236`**") + || !readme.contains("Dream Displays **`1.9.6`**") + || !readme.contains("retire entièrement le module temporaire ZEVENT")) { + throw new GradleException("The alpha.236 Dream Displays-only release is incomplete") } } } @@ -8825,7 +8817,7 @@ tasks.named("verifyWorkspace") { dependsOn tasks.named("verifyAlpha231Release") dependsOn tasks.named("verifyAlpha232Release") dependsOn tasks.named("verifyAlpha233Release") - dependsOn tasks.named("verifyAlpha235Release") + dependsOn tasks.named("verifyAlpha236Release") } tasks.named("check") { @@ -8953,7 +8945,7 @@ def packwizReleaseArchive = layout.buildDirectory.file( tasks.register("syncPackwiz") { group = "distribution" - description = "Builds and synchronises the eleven temporary weekend JARs into the Packwiz source directory." + description = "Builds and synchronises the ten Sanctuary JARs into the Packwiz source directory." dependsOn distributedModuleIds.collect { id -> project(":${id}").tasks.named("jar") } inputs.files(distributedModuleIds.collect { id -> def moduleProject = project(":${id}") @@ -8977,6 +8969,7 @@ tasks.register("syncPackwiz") { into file("pack/packwiz/mods") } } + delete fileTree("pack/packwiz/mods") { include "zevent-*.jar" } copy { from "pack/prism/overrides/config/iris.properties" into "pack/packwiz/config" diff --git a/gradle.properties b/gradle.properties index e7c2d63..7431dec 100644 --- a/gradle.properties +++ b/gradle.properties @@ -30,7 +30,5 @@ onlyfun_version=0.0.0-alpha.27 onlyfun_lifecycle=active sanctuary_version=0.0.0-alpha.139 sanctuary_lifecycle=active -zevent_version=0.0.0-alpha.3 -zevent_lifecycle=active -pack_version=26.2.0-alpha.235 +pack_version=26.2.0-alpha.236 maven_group=fr.koka99cab.sanctuary26 diff --git a/pack/migrations/26.2.0-alpha.235-remove-zevent-to-alpha.236.json b/pack/migrations/26.2.0-alpha.235-remove-zevent-to-alpha.236.json new file mode 100644 index 0000000..d87b8ec --- /dev/null +++ b/pack/migrations/26.2.0-alpha.235-remove-zevent-to-alpha.236.json @@ -0,0 +1,43 @@ +{ + "schema_version": 1, + "status": "released", + "released_in": "26.2.0-alpha.236", + "pack": { + "source_version": "26.2.0-alpha.235", + "target_version": "26.2.0-alpha.236" + }, + "removed_module": { + "id": "zevent", + "source_module_version": "0.0.0-alpha.3", + "target_module_version": null, + "source_directory_removed": true, + "client_jar_removed": true, + "server_jar_removed": true, + "registry_ids_removed": [ + "zevent:zevent_screen" + ] + }, + "replacement": { + "module": "dreamdisplays", + "version": "1.9.6", + "modrinth_project_id": "4IIKQyBu", + "modrinth_version_id": "GxyW2ksW", + "client_and_server_required": true, + "automatic_screen_conversion": false + }, + "compatibility": { + "world_reset_required": false, + "world_backup_recommended": true, + "existing_zevent_screens_must_be_replaced": true, + "remaining_module_data_preserved": true, + "remaining_network_protocols_changed": false, + "client_and_server_must_remove_zevent": true + }, + "distribution": { + "packwiz_index_refreshed": true, + "prism_modrinth_index_updated": true, + "zevent_jar_absent": true, + "dream_displays_required": true, + "distributed_module_count": 10 + } +} diff --git a/pack/packwiz/index.toml b/pack/packwiz/index.toml index 87f0935..1ef7e21 100644 --- a/pack/packwiz/index.toml +++ b/pack/packwiz/index.toml @@ -81,7 +81,3 @@ metafile = true file = "mods/sodium.pw.toml" hash = "f06c0b9150da9877b99cb265d037c067e509340d9bf347e02cef2043c110e963" metafile = true - -[[files]] -file = "mods/zevent-0.0.0-alpha.3.jar" -hash = "98f1af94549e95fabf99141130c2a56b650165bb405cae57af488c2811b907be" diff --git a/pack/packwiz/pack.toml b/pack/packwiz/pack.toml index 8bee2c3..807cf67 100644 --- a/pack/packwiz/pack.toml +++ b/pack/packwiz/pack.toml @@ -1,12 +1,12 @@ name = "Sanctuary 26.2" author = "KOKA99CAB" -version = "26.2.0-alpha.235" +version = "26.2.0-alpha.236" pack-format = "packwiz:1.1.0" [index] file = "index.toml" hash-format = "sha256" -hash = "4b92999f44991f7d4cbcbf221949ec2fd50602156da16d0655a6e89a554dfda2" +hash = "f9229ef42ae4f731d8642ec2e8f674d5593ad5b3e8c5deb87837fd490cc353e9" [versions] fabric = "0.19.3" diff --git a/pack/prism/modrinth.index.json b/pack/prism/modrinth.index.json index 204f06b..0170a5c 100644 --- a/pack/prism/modrinth.index.json +++ b/pack/prism/modrinth.index.json @@ -3,7 +3,7 @@ "game": "minecraft", "name": "Sanctuary 26.2", "summary": "Sanctuary 26.2 — progression, exploration, worldgen and multiplayer systems by KOKA99CAB.", - "versionId": "26.2.0-alpha.235", + "versionId": "26.2.0-alpha.236", "files": [ { "path": "mods/fabric-api-0.159.0+26.2.jar", diff --git a/pack/release.json b/pack/release.json index 256d525..f60b467 100644 --- a/pack/release.json +++ b/pack/release.json @@ -1,6 +1,6 @@ { "schema_version": 1, - "pack_version": "26.2.0-alpha.235", + "pack_version": "26.2.0-alpha.236", "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.235.mrpack", + "primary_file": "sanctuary-26.2.0-alpha.236.mrpack", "shared_client_server_pack": true, "update_owner": "packwiz-installer", "check_on_launch": true, diff --git a/settings.gradle b/settings.gradle index 3628eb6..f7665ef 100644 --- a/settings.gradle +++ b/settings.gradle @@ -21,6 +21,5 @@ include( "onlyfun", "sanctuary", "events", - "masterkey", - "zevent" + "masterkey" ) diff --git a/zevent/README.md b/zevent/README.md deleted file mode 100644 index 5ff20f6..0000000 --- a/zevent/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# ZEVENT - -Mod Fabric événementiel distribué séparément du pack Sanctuary. Il ajoute un écran mural multibloc de 9×5 blocs qui lit une chaîne Twitch en direct. - -## Utilisation - -1. Poser l'écran contre un mur libre de 9×5 blocs. Le bloc visé devient le centre de l'écran. -2. Faire un clic droit sur n'importe laquelle de ses 45 cases. -3. Saisir un nom de chaîne (`zeventfr`) ou coller une URL Twitch, puis valider. - -La chaîne est enregistrée par le serveur et synchronisée aux joueurs. Le client résout le flux Twitch puis le décode nativement dans la surface. Son volume utilise la catégorie **Disques** de Minecraft et diminue jusqu'au silence à 64 blocs. Seul l'écran le plus proche est audible et deux flux visibles au maximum sont décodés par client. - -## Dépendance et limites - -Le client exige [Dream Displays](https://modrinth.com/mod/dream-displays) `1.9.6` pour la résolution HLS Twitch, le décodage H.264/AAC et l'envoi des images vers le GPU. Une connexion Internet est nécessaire. Cette version est épinglée : l'adaptateur ZEVENT utilise `DisplayScreen` pour posséder un lecteur local sans l'enregistrer comme écran Dream Displays, puis réutilise uniquement son `RenderType` dans le renderer du multibloc ZEVENT. Toute mise à jour de Dream Displays doit donc être validée avec `:zevent:check` et un essai de flux Twitch réel. - -Le serveur ne reçoit jamais d'URL arbitraire : les entrées sont ramenées à un identifiant Twitch de 1 à 25 caractères (`a-z`, `0-9`, `_`). Le client ne construit ensuite que l'URL canonique `https://www.twitch.tv/` remise au résolveur Twitch de Dream Displays. - -Sources du lecteur : [Dream Displays](https://github.com/arnodoelinger/dreamdisplays). diff --git a/zevent/art/icon.svg b/zevent/art/icon.svg deleted file mode 100644 index f0000f9..0000000 --- a/zevent/art/icon.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/zevent/build.gradle b/zevent/build.gradle deleted file mode 100644 index 2d22027..0000000 --- a/zevent/build.gradle +++ /dev/null @@ -1,13 +0,0 @@ -repositories { - mavenCentral() -} - -dependencies { - implementation "maven.modrinth:dreamdisplays:GxyW2ksW" - testImplementation "org.junit.jupiter:junit-jupiter:5.11.4" - testRuntimeOnly "org.junit.platform:junit-platform-launcher:1.11.4" -} - -tasks.named("test") { - useJUnitPlatform() -} diff --git a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/ZeventMod.java b/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/ZeventMod.java deleted file mode 100644 index b5bc4e5..0000000 --- a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/ZeventMod.java +++ /dev/null @@ -1,30 +0,0 @@ -package fr.koka99cab.sanctuary26.zevent; - -import fr.koka99cab.sanctuary26.zevent.network.ZeventNetworking; -import fr.koka99cab.sanctuary26.zevent.registry.ZeventRegistries; -import net.fabricmc.api.ModInitializer; -import net.minecraft.resources.Identifier; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public final class ZeventMod implements ModInitializer { - public static final String MOD_ID = "zevent"; - public static final String DISPLAY_NAME = "ZEVENT"; - public static final int CURRENT_DATA_VERSION = 1; - public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); - - public ZeventMod() { - } - - public static Identifier id(String path) { - return Identifier.fromNamespaceAndPath(MOD_ID, path); - } - - @Override - public void onInitialize() { - ZeventRegistries.initialize(); - ZeventNetworking.initialize(); - LOGGER.info("[{}] 9x5 Twitch screen ready (data v{}, network v{}).", - DISPLAY_NAME, CURRENT_DATA_VERSION, ZeventNetworking.PROTOCOL_VERSION); - } -} diff --git a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/block/ZeventScreenBlock.java b/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/block/ZeventScreenBlock.java deleted file mode 100644 index 45a504e..0000000 --- a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/block/ZeventScreenBlock.java +++ /dev/null @@ -1,206 +0,0 @@ -package fr.koka99cab.sanctuary26.zevent.block; - -import com.mojang.serialization.MapCodec; -import fr.koka99cab.sanctuary26.zevent.block.entity.ZeventScreenBlockEntity; -import fr.koka99cab.sanctuary26.zevent.network.ZeventNetworking; -import java.util.Map; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.util.RandomSource; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.ScheduledTickAccess; -import net.minecraft.world.level.block.BaseEntityBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.Mirror; -import net.minecraft.world.level.block.RenderShape; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockBehaviour; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.block.state.properties.EnumProperty; -import net.minecraft.world.level.block.state.properties.IntegerProperty; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.VoxelShape; - -/** One block type represents all 45 cells; only its central cell owns playback state. */ -public final class ZeventScreenBlock extends BaseEntityBlock { - public static final MapCodec CODEC = simpleCodec(ZeventScreenBlock::new); - public static final EnumProperty FACING = BlockStateProperties.HORIZONTAL_FACING; - public static final IntegerProperty COLUMN = IntegerProperty.create("column", 0, ZeventScreenLayout.WIDTH - 1); - public static final IntegerProperty ROW = IntegerProperty.create("row", 0, ZeventScreenLayout.HEIGHT - 1); - private static final ThreadLocal REMOVING_STRUCTURE = ThreadLocal.withInitial(() -> false); - private static final Map SHAPES = Map.of( - Direction.NORTH, Block.box(0.0D, 0.0D, 14.0D, 16.0D, 16.0D, 16.0D), - Direction.SOUTH, Block.box(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 2.0D), - Direction.WEST, Block.box(14.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D), - Direction.EAST, Block.box(0.0D, 0.0D, 0.0D, 2.0D, 16.0D, 16.0D) - ); - - public ZeventScreenBlock(BlockBehaviour.Properties properties) { - super(properties); - registerDefaultState(stateDefinition.any() - .setValue(FACING, Direction.NORTH) - .setValue(COLUMN, ZeventScreenLayout.CONTROLLER_COLUMN) - .setValue(ROW, ZeventScreenLayout.CONTROLLER_ROW)); - } - - @Override - public MapCodec codec() { - return CODEC; - } - - @Override - public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { - return new ZeventScreenBlockEntity(pos, state); - } - - @Override - protected RenderShape getRenderShape(BlockState state) { - return RenderShape.MODEL; - } - - @Override - public BlockState getStateForPlacement(BlockPlaceContext context) { - Direction facing = context.getClickedFace(); - if (!facing.getAxis().isHorizontal()) return null; - BlockPos controller = context.getClickedPos(); - if (!canPlaceScreen(context.getLevel(), controller, facing)) return null; - return defaultBlockState().setValue(FACING, facing); - } - - @Override - public void setPlacedBy(Level level, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { - super.setPlacedBy(level, pos, state, placer, stack); - if (level.isClientSide() || !ZeventScreenLayout.isController(state)) return; - Direction facing = state.getValue(FACING); - for (int row = 0; row < ZeventScreenLayout.HEIGHT; row++) { - for (int column = 0; column < ZeventScreenLayout.WIDTH; column++) { - if (column == ZeventScreenLayout.CONTROLLER_COLUMN - && row == ZeventScreenLayout.CONTROLLER_ROW) continue; - BlockPos part = ZeventScreenLayout.partPos(pos, facing, column, row); - level.setBlock(part, defaultBlockState().setValue(FACING, facing) - .setValue(COLUMN, column).setValue(ROW, row), Block.UPDATE_ALL); - } - } - } - - @Override - protected boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) { - Direction facing = state.getValue(FACING); - BlockPos support = pos.relative(facing.getOpposite()); - return level.getBlockState(support).isFaceSturdy(level, support, facing); - } - - @Override - protected BlockState updateShape(BlockState state, LevelReader level, ScheduledTickAccess ticks, - BlockPos pos, Direction direction, BlockPos neighborPos, BlockState neighborState, RandomSource random) { - return direction == state.getValue(FACING).getOpposite() && !state.canSurvive(level, pos) - ? Blocks.AIR.defaultBlockState() - : super.updateShape(state, level, ticks, pos, direction, neighborPos, neighborState, random); - } - - @Override - protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { - return SHAPES.get(state.getValue(FACING)); - } - - @Override - protected InteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, - Player player, InteractionHand hand, BlockHitResult hit) { - return openOptions(state, level, pos, player); - } - - @Override - protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, - Player player, BlockHitResult hit) { - return openOptions(state, level, pos, player); - } - - @Override - public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, Player player) { - if (!level.isClientSide()) removeOtherParts(level, pos, state); - return super.playerWillDestroy(level, pos, state, player); - } - - @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, - boolean movedByPiston) { - if (!REMOVING_STRUCTURE.get()) removeOtherParts(level, pos, state); - super.affectNeighborsAfterRemoval(state, level, pos, movedByPiston); - } - - @Override - protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(FACING, COLUMN, ROW); - } - - @Override - protected BlockState rotate(BlockState state, Rotation rotation) { - return state.setValue(FACING, rotation.rotate(state.getValue(FACING))); - } - - @Override - protected BlockState mirror(BlockState state, Mirror mirror) { - return state.rotate(mirror.getRotation(state.getValue(FACING))); - } - - private static boolean canPlaceScreen(LevelReader level, BlockPos controller, Direction facing) { - for (int row = 0; row < ZeventScreenLayout.HEIGHT; row++) { - for (int column = 0; column < ZeventScreenLayout.WIDTH; column++) { - BlockPos part = ZeventScreenLayout.partPos(controller, facing, column, row); - if (level.isOutsideBuildHeight(part) || !level.getBlockState(part).isAir()) return false; - BlockPos support = part.relative(facing.getOpposite()); - if (!level.getBlockState(support).isFaceSturdy(level, support, facing)) return false; - } - } - return true; - } - - private static InteractionResult openOptions(BlockState state, Level level, BlockPos pos, Player player) { - if (level.isClientSide()) return InteractionResult.SUCCESS; - BlockPos controller = ZeventScreenLayout.controllerPos(pos, state); - if (player instanceof ServerPlayer serverPlayer - && level.getBlockEntity(controller) instanceof ZeventScreenBlockEntity screen) { - ZeventNetworking.openOptions(serverPlayer, screen); - return InteractionResult.SUCCESS_SERVER; - } - return InteractionResult.CONSUME; - } - - private static void removeOtherParts(Level level, BlockPos brokenPos, BlockState brokenState) { - if (!(brokenState.getBlock() instanceof ZeventScreenBlock)) return; - BlockPos controller = ZeventScreenLayout.controllerPos(brokenPos, brokenState); - Direction facing = brokenState.getValue(FACING); - REMOVING_STRUCTURE.set(true); - try { - for (int row = 0; row < ZeventScreenLayout.HEIGHT; row++) { - for (int column = 0; column < ZeventScreenLayout.WIDTH; column++) { - BlockPos part = ZeventScreenLayout.partPos(controller, facing, column, row); - if (part.equals(brokenPos)) continue; - BlockState candidate = level.getBlockState(part); - if (candidate.getBlock() instanceof ZeventScreenBlock - && ZeventScreenLayout.controllerPos(part, candidate).equals(controller)) { - level.setBlock(part, Blocks.AIR.defaultBlockState(), - Block.UPDATE_ALL | Block.UPDATE_SUPPRESS_DROPS); - } - } - } - } finally { - REMOVING_STRUCTURE.set(false); - } - } -} diff --git a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/block/ZeventScreenLayout.java b/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/block/ZeventScreenLayout.java deleted file mode 100644 index 9282f2b..0000000 --- a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/block/ZeventScreenLayout.java +++ /dev/null @@ -1,64 +0,0 @@ -package fr.koka99cab.sanctuary26.zevent.block; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.level.block.state.BlockState; - -/** Pure 9x5 layout math shared by placement, interaction and teardown. */ -public final class ZeventScreenLayout { - public static final int WIDTH = 9; - public static final int HEIGHT = 5; - public static final int CONTROLLER_COLUMN = WIDTH / 2; - public static final int CONTROLLER_ROW = HEIGHT / 2; - - private ZeventScreenLayout() { - } - - public static Direction right(Direction facing) { - if (!facing.getAxis().isHorizontal()) throw new IllegalArgumentException("Horizontal facing required"); - return facing.getCounterClockWise(); - } - - public static BlockPos partPos(BlockPos controller, Direction facing, int column, int row) { - validateCell(column, row); - Direction right = right(facing); - return controller.offset( - right.getStepX() * (column - CONTROLLER_COLUMN), - row - CONTROLLER_ROW, - right.getStepZ() * (column - CONTROLLER_COLUMN) - ); - } - - /** Returns the minimum world-space corner used by rectangular media renderers. */ - public static BlockPos anchor(BlockPos controller, Direction facing) { - BlockPos first = partPos(controller, facing, 0, 0); - BlockPos last = partPos(controller, facing, WIDTH - 1, HEIGHT - 1); - return new BlockPos( - Math.min(first.getX(), last.getX()), - Math.min(first.getY(), last.getY()), - Math.min(first.getZ(), last.getZ())); - } - - public static BlockPos controllerPos(BlockPos part, BlockState state) { - Direction facing = state.getValue(ZeventScreenBlock.FACING); - int column = state.getValue(ZeventScreenBlock.COLUMN); - int row = state.getValue(ZeventScreenBlock.ROW); - Direction right = right(facing); - return part.offset( - -right.getStepX() * (column - CONTROLLER_COLUMN), - -(row - CONTROLLER_ROW), - -right.getStepZ() * (column - CONTROLLER_COLUMN) - ); - } - - public static boolean isController(BlockState state) { - return state.getValue(ZeventScreenBlock.COLUMN) == CONTROLLER_COLUMN - && state.getValue(ZeventScreenBlock.ROW) == CONTROLLER_ROW; - } - - private static void validateCell(int column, int row) { - if (column < 0 || column >= WIDTH || row < 0 || row >= HEIGHT) { - throw new IllegalArgumentException("Invalid ZEVENT screen cell " + column + "," + row); - } - } -} diff --git a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/block/entity/ZeventScreenBlockEntity.java b/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/block/entity/ZeventScreenBlockEntity.java deleted file mode 100644 index fd259ca..0000000 --- a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/block/entity/ZeventScreenBlockEntity.java +++ /dev/null @@ -1,75 +0,0 @@ -package fr.koka99cab.sanctuary26.zevent.block.entity; - -import fr.koka99cab.sanctuary26.zevent.ZeventMod; -import fr.koka99cab.sanctuary26.zevent.registry.ZeventRegistries; -import fr.koka99cab.sanctuary26.zevent.twitch.TwitchChannel; -import net.minecraft.core.BlockPos; -import net.minecraft.core.HolderLookup; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientGamePacketListener; -import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.storage.ValueInput; -import net.minecraft.world.level.storage.ValueOutput; - -/** The central cell persists one bounded Twitch channel; all other cells are stateless mirrors. */ -public final class ZeventScreenBlockEntity extends BlockEntity { - private static final String DATA_VERSION_KEY = "DataVersion"; - private static final String CHANNEL_KEY = "Channel"; - private int dataVersion = ZeventMod.CURRENT_DATA_VERSION; - private String channel = TwitchChannel.DEFAULT; - - public ZeventScreenBlockEntity(BlockPos pos, BlockState state) { - super(ZeventRegistries.ZEVENT_SCREEN_BLOCK_ENTITY, pos, state); - } - - public String channel() { - return channel; - } - - public boolean setChannel(String requested) { - if (dataVersion > ZeventMod.CURRENT_DATA_VERSION) return false; - String normalized = TwitchChannel.normalize(requested).orElse(null); - if (normalized == null) return false; - if (normalized.equals(channel)) return true; - channel = normalized; - setChanged(); - if (level != null) { - BlockState state = getBlockState(); - level.sendBlockUpdated(worldPosition, state, state, Block.UPDATE_CLIENTS); - } - return true; - } - - public boolean writable() { - return dataVersion <= ZeventMod.CURRENT_DATA_VERSION; - } - - @Override - protected void saveAdditional(ValueOutput output) { - super.saveAdditional(output); - output.putInt(DATA_VERSION_KEY, dataVersion); - output.putString(CHANNEL_KEY, channel); - } - - @Override - protected void loadAdditional(ValueInput input) { - super.loadAdditional(input); - dataVersion = input.getIntOr(DATA_VERSION_KEY, 1); - channel = TwitchChannel.normalize(input.getStringOr(CHANNEL_KEY, TwitchChannel.DEFAULT)) - .orElse(TwitchChannel.DEFAULT); - } - - @Override - public Packet getUpdatePacket() { - return ClientboundBlockEntityDataPacket.create(this); - } - - @Override - public CompoundTag getUpdateTag(HolderLookup.Provider lookup) { - return saveWithoutMetadata(lookup); - } -} diff --git a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/client/ZeventClient.java b/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/client/ZeventClient.java deleted file mode 100644 index 19e5044..0000000 --- a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/client/ZeventClient.java +++ /dev/null @@ -1,29 +0,0 @@ -package fr.koka99cab.sanctuary26.zevent.client; - -import fr.koka99cab.sanctuary26.zevent.ZeventMod; -import fr.koka99cab.sanctuary26.zevent.client.gui.ZeventScreenOptionsScreen; -import fr.koka99cab.sanctuary26.zevent.client.render.ZeventScreenBlockEntityRenderer; -import fr.koka99cab.sanctuary26.zevent.client.twitch.TwitchBrowserManager; -import fr.koka99cab.sanctuary26.zevent.network.OpenScreenOptionsPayload; -import fr.koka99cab.sanctuary26.zevent.registry.ZeventRegistries; -import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; -import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; -import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; -import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; -import net.fabricmc.fabric.api.client.rendering.v1.BlockEntityRendererRegistry; - -public final class ZeventClient implements ClientModInitializer { - @Override - public void onInitializeClient() { - BlockEntityRendererRegistry.register(ZeventRegistries.ZEVENT_SCREEN_BLOCK_ENTITY, - ZeventScreenBlockEntityRenderer::new); - ClientPlayNetworking.registerGlobalReceiver(OpenScreenOptionsPayload.TYPE, (payload, context) -> - context.client().execute(() -> context.client().gui.setScreen( - new ZeventScreenOptionsScreen(context.client().gui.screen(), payload)))); - ClientTickEvents.END_CLIENT_TICK.register(TwitchBrowserManager::tick); - ClientPlayConnectionEvents.DISCONNECT.register((handler, client) -> TwitchBrowserManager.clear(client)); - ClientLifecycleEvents.CLIENT_STOPPING.register(TwitchBrowserManager::shutdown); - ZeventMod.LOGGER.info("[{}] Native Twitch renderer registered.", ZeventMod.DISPLAY_NAME); - } -} diff --git a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/client/gui/ZeventScreenOptionsScreen.java b/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/client/gui/ZeventScreenOptionsScreen.java deleted file mode 100644 index c4c44ca..0000000 --- a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/client/gui/ZeventScreenOptionsScreen.java +++ /dev/null @@ -1,117 +0,0 @@ -package fr.koka99cab.sanctuary26.zevent.client.gui; - -import fr.koka99cab.sanctuary26.zevent.network.OpenScreenOptionsPayload; -import fr.koka99cab.sanctuary26.zevent.network.SaveScreenChannelPayload; -import fr.koka99cab.sanctuary26.zevent.twitch.TwitchChannel; -import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; -import net.minecraft.client.gui.GuiGraphicsExtractor; -import net.minecraft.client.gui.components.Button; -import net.minecraft.client.gui.components.EditBox; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.Component; - -/** Small in-game configuration surface opened by right-clicking any screen cell. */ -public final class ZeventScreenOptionsScreen extends Screen { - private static final int PANEL_WIDTH = 340; - private static final int PANEL_HEIGHT = 184; - private static final int BACKDROP = 0xE0121715; - private static final int BORDER = 0xFF3BEA8C; - private static final int TITLE = 0xFFF5FFF9; - private static final int TEXT = 0xFFC7D7CE; - private static final int ERROR = 0xFFFF6B78; - private final Screen parent; - private final OpenScreenOptionsPayload payload; - private EditBox channel; - private Button save; - private Component validation = Component.empty(); - - public ZeventScreenOptionsScreen(Screen parent, OpenScreenOptionsPayload payload) { - super(Component.translatable("screen.zevent.options.title")); - this.parent = parent; - this.payload = payload; - } - - @Override - protected void init() { - int x = panelX() + 16; - int y = panelY(); - channel = addRenderableWidget(new EditBox(font, x, y + 54, PANEL_WIDTH - 32, 20, - Component.translatable("screen.zevent.options.channel"))); - channel.setMaxLength(TwitchChannel.MAX_INPUT_LENGTH); - channel.setValue(payload.channel()); - channel.setHint(Component.translatable("screen.zevent.options.hint")); - channel.setEditable(payload.writable()); - channel.setResponder(value -> refreshValidation()); - - Button official = addRenderableWidget(Button.builder( - Component.translatable("screen.zevent.options.official"), button -> select("zeventfr")) - .bounds(x, y + 82, 150, 20).build()); - Button zerator = addRenderableWidget(Button.builder( - Component.translatable("screen.zevent.options.zerator"), button -> select("zerator")) - .bounds(x + 158, y + 82, 150, 20).build()); - official.active = payload.writable(); - zerator.active = payload.writable(); - - save = addRenderableWidget(Button.builder(Component.translatable("gui.done"), button -> submit()) - .bounds(x, y + 142, 150, 20).build()); - addRenderableWidget(Button.builder(Component.translatable("gui.cancel"), button -> onClose()) - .bounds(x + 158, y + 142, 150, 20).build()); - refreshValidation(); - setInitialFocus(channel); - } - - @Override - public void tick() { - refreshValidation(); - } - - @Override - public void extractRenderState(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float tickDelta) { - int x = panelX(); - int y = panelY(); - graphics.fill(x, y, x + PANEL_WIDTH, y + PANEL_HEIGHT, BACKDROP); - graphics.outline(x, y, PANEL_WIDTH, PANEL_HEIGHT, BORDER); - graphics.centeredText(font, title, width / 2, y + 12, TITLE); - graphics.text(font, Component.translatable("screen.zevent.options.current", payload.channel()), - x + 16, y + 31, TEXT); - graphics.text(font, Component.translatable("screen.zevent.options.channel"), x + 16, y + 43, TEXT); - if (!validation.getString().isEmpty()) graphics.text(font, validation, x + 16, y + 113, ERROR); - super.extractRenderState(graphics, mouseX, mouseY, tickDelta); - } - - private void select(String selected) { - if (payload.writable()) channel.setValue(selected); - } - - private void refreshValidation() { - if (channel == null || save == null) return; - boolean valid = TwitchChannel.normalize(channel.getValue()).isPresent(); - validation = valid ? Component.empty() : Component.translatable("screen.zevent.options.invalid"); - save.active = payload.writable() && valid && ClientPlayNetworking.canSend(SaveScreenChannelPayload.TYPE); - } - - private void submit() { - String normalized = TwitchChannel.normalize(channel.getValue()).orElse(null); - if (normalized == null || !save.active) return; - ClientPlayNetworking.send(new SaveScreenChannelPayload(payload.pos(), normalized)); - onClose(); - } - - private int panelX() { - return (width - PANEL_WIDTH) / 2; - } - - private int panelY() { - return Math.max(2, (height - PANEL_HEIGHT) / 2); - } - - @Override - public void onClose() { - if (minecraft != null) minecraft.gui.setScreen(parent); - } - - @Override - public boolean isPauseScreen() { - return false; - } -} diff --git a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/client/render/ZeventScreenBlockEntityRenderer.java b/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/client/render/ZeventScreenBlockEntityRenderer.java deleted file mode 100644 index aa4075e..0000000 --- a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/client/render/ZeventScreenBlockEntityRenderer.java +++ /dev/null @@ -1,90 +0,0 @@ -package fr.koka99cab.sanctuary26.zevent.client.render; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import fr.koka99cab.sanctuary26.zevent.block.ZeventScreenBlock; -import fr.koka99cab.sanctuary26.zevent.block.ZeventScreenLayout; -import fr.koka99cab.sanctuary26.zevent.block.entity.ZeventScreenBlockEntity; -import fr.koka99cab.sanctuary26.zevent.client.render.state.ZeventScreenRenderState; -import fr.koka99cab.sanctuary26.zevent.client.twitch.TwitchBrowserManager; -import net.minecraft.client.renderer.SubmitNodeCollector; -import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; -import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; -import net.minecraft.client.renderer.feature.ModelFeatureRenderer; -import net.minecraft.client.renderer.state.level.CameraRenderState; -import net.minecraft.core.Direction; -import net.minecraft.world.phys.Vec3; - -/** Projects one decoded video texture over the central block entity's complete 9x5 surface. */ -public final class ZeventScreenBlockEntityRenderer - implements BlockEntityRenderer { - private static final int VIEW_DISTANCE = 128; - private static final double VIEW_DISTANCE_SQR = VIEW_DISTANCE * VIEW_DISTANCE; - private static final float HALF_WIDTH = 4.42F; - private static final float HALF_HEIGHT = 2.42F; - private static final float CENTER_TO_FRONT = 0.369F; - - public ZeventScreenBlockEntityRenderer(BlockEntityRendererProvider.Context context) { - } - - @Override - public ZeventScreenRenderState createRenderState() { - return new ZeventScreenRenderState(); - } - - @Override - public void extractRenderState(ZeventScreenBlockEntity screen, ZeventScreenRenderState state, - float tickProgress, Vec3 cameraPos, ModelFeatureRenderer.CrumblingOverlay crumblingOverlay) { - BlockEntityRenderer.super.extractRenderState(screen, state, tickProgress, cameraPos, crumblingOverlay); - state.renderType = null; - if (!ZeventScreenLayout.isController(screen.getBlockState()) || screen.getLevel() == null) return; - state.facing = screen.getBlockState().getValue(ZeventScreenBlock.FACING); - state.renderType = TwitchBrowserManager.markVisible( - screen.getLevel(), screen.getBlockPos(), state.facing, screen.channel()); - } - - @Override - public void submit(ZeventScreenRenderState state, PoseStack poseStack, - SubmitNodeCollector submitNodeCollector, CameraRenderState cameraRenderState) { - if (state.renderType == null) return; - submitNodeCollector.submitCustomGeometry(poseStack, - state.renderType, - (pose, consumer) -> drawScreen(pose, consumer, state.facing)); - } - - @Override - public boolean shouldRenderOffScreen() { - return true; - } - - @Override - public int getViewDistance() { - return VIEW_DISTANCE; - } - - @Override - public boolean shouldRender(ZeventScreenBlockEntity screen, Vec3 cameraPos) { - return ZeventScreenLayout.isController(screen.getBlockState()) - && Vec3.atCenterOf(screen.getBlockPos()).distanceToSqr(cameraPos) <= VIEW_DISTANCE_SQR; - } - - private static void drawScreen(PoseStack.Pose pose, VertexConsumer consumer, Direction facing) { - Direction right = ZeventScreenLayout.right(facing); - float centerX = 0.5F - facing.getStepX() * CENTER_TO_FRONT; - float centerZ = 0.5F - facing.getStepZ() * CENTER_TO_FRONT; - vertex(consumer, pose, centerX, centerZ, right, -HALF_WIDTH, -HALF_HEIGHT, 0.0F, 1.0F); - vertex(consumer, pose, centerX, centerZ, right, HALF_WIDTH, -HALF_HEIGHT, 1.0F, 1.0F); - vertex(consumer, pose, centerX, centerZ, right, HALF_WIDTH, HALF_HEIGHT, 1.0F, 0.0F); - vertex(consumer, pose, centerX, centerZ, right, -HALF_WIDTH, HALF_HEIGHT, 0.0F, 0.0F); - } - - private static void vertex(VertexConsumer consumer, PoseStack.Pose pose, float centerX, float centerZ, - Direction right, float horizontal, float vertical, float u, float v) { - consumer.addVertex(pose, - centerX + right.getStepX() * horizontal, - 0.5F + vertical, - centerZ + right.getStepZ() * horizontal) - .setUv(u, v) - .setColor(0xFFFFFFFF); - } -} diff --git a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/client/render/state/ZeventScreenRenderState.java b/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/client/render/state/ZeventScreenRenderState.java deleted file mode 100644 index 6a679cb..0000000 --- a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/client/render/state/ZeventScreenRenderState.java +++ /dev/null @@ -1,10 +0,0 @@ -package fr.koka99cab.sanctuary26.zevent.client.render.state; - -import net.minecraft.client.renderer.blockentity.state.BlockEntityRenderState; -import net.minecraft.client.renderer.rendertype.RenderType; -import net.minecraft.core.Direction; - -public final class ZeventScreenRenderState extends BlockEntityRenderState { - public Direction facing = Direction.NORTH; - public RenderType renderType; -} diff --git a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/client/twitch/TwitchBrowserManager.java b/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/client/twitch/TwitchBrowserManager.java deleted file mode 100644 index e3fc565..0000000 --- a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/client/twitch/TwitchBrowserManager.java +++ /dev/null @@ -1,243 +0,0 @@ -package fr.koka99cab.sanctuary26.zevent.client.twitch; - -import com.dreamdisplays.api.display.model.property.DisplayFacing; -import com.dreamdisplays.api.display.model.property.DisplayRotation; -import com.dreamdisplays.api.media.audio.service.AudioAcousticsService; -import com.dreamdisplays.api.media.audio.service.keys.AudioAcousticsServices; -import com.dreamdisplays.api.playback.model.PlaybackMode; -import com.dreamdisplays.platform.client.core.DreamServices; -import com.dreamdisplays.platform.client.displays.DisplayScreen; -import fr.koka99cab.sanctuary26.zevent.ZeventMod; -import fr.koka99cab.sanctuary26.zevent.block.ZeventScreenLayout; -import fr.koka99cab.sanctuary26.zevent.block.entity.ZeventScreenBlockEntity; -import fr.koka99cab.sanctuary26.zevent.twitch.TwitchChannel; -import java.nio.charset.StandardCharsets; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.Locale; -import java.util.Map; -import java.util.UUID; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.rendertype.RenderType; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceKey; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.level.Level; -import net.minecraft.world.phys.Vec3; - -/** Owns a small, distance-bounded set of native Twitch players supplied by Dream Displays. */ -public final class TwitchBrowserManager { - private static final int MAXIMUM_PLAYERS = 2; - private static final int STALE_TICKS = 40; - private static final int AUDIBLE_FRESH_TICKS = 10; - private static final int RETRY_TICKS = 20 * 30; - private static final double AUDIO_DISTANCE = 64.0D; - private static final double AUDIO_DISTANCE_SQR = AUDIO_DISTANCE * AUDIO_DISTANCE; - private static final double FULL_VOLUME_DISTANCE = 4.0D; - private static final Map SESSIONS = new LinkedHashMap<>(); - private static boolean initializationNoticeShown; - - private TwitchBrowserManager() { - } - - public static RenderType markVisible(Level level, BlockPos pos, Direction facing, String requestedChannel) { - Minecraft client = Minecraft.getInstance(); - if (client.level != level || client.player == null) return null; - String channel = TwitchChannel.normalize(requestedChannel).orElse(TwitchChannel.DEFAULT); - ScreenKey key = new ScreenKey(level.dimension(), pos.immutable()); - Session session = SESSIONS.get(key); - if (session != null && session.facing != facing) { - remove(session); - session = null; - } - if (session == null) { - if (!admit(client, pos)) return null; - session = start(client, key, facing, channel); - SESSIONS.put(key, session); - } - session.lastSeenTick = level.getGameTime(); - if (!session.channel.equals(channel)) session.changeChannel(channel); - if (session.player == null) return null; - try { - session.player.fitTexture(); - return session.player.isVideoStarted() ? session.player.getRenderType() : null; - } catch (RuntimeException | LinkageError exception) { - ZeventMod.LOGGER.warn("Unable to upload a ZEVENT Twitch frame", exception); - return null; - } - } - - public static void tick(Minecraft client) { - if (client.level == null || client.player == null) { - clear(client); - return; - } - long now = client.level.getGameTime(); - for (Session session : SESSIONS.values().toArray(Session[]::new)) { - boolean wrongLevel = !session.key.dimension.equals(client.level.dimension()); - boolean stale = now < session.lastSeenTick || now - session.lastSeenTick > STALE_TICKS; - boolean missing = !client.level.hasChunkAt(session.key.pos) - || !(client.level.getBlockEntity(session.key.pos) instanceof ZeventScreenBlockEntity screen) - || !ZeventScreenLayout.isController(screen.getBlockState()); - if (wrongLevel || stale || missing) { - remove(session); - continue; - } - if (session.player != null) session.player.tick(session.key.pos); - if (session.player != null) { - if (session.player.isVideoStarted()) session.errorReported = false; - if (session.player.getMediaError() != null) { - if (!session.errorReported) { - session.errorReported = true; - client.player.sendOverlayMessage(Component.translatable( - "message.zevent.player.unavailable", session.channel)); - ZeventMod.LOGGER.warn("Twitch channel {} could not be played: {}", - session.channel, session.player.getMediaError().getMessage()); - } - if (now - session.lastRetryTick >= RETRY_TICKS) { - session.lastRetryTick = now; - session.player.retryVideo(); - } - } - } - } - updateVolumes(client, now); - } - - public static void clear(Minecraft client) { - for (Session session : SESSIONS.values().toArray(Session[]::new)) remove(session); - SESSIONS.clear(); - initializationNoticeShown = false; - } - - public static void shutdown(Minecraft client) { - clear(client); - } - - private static boolean admit(Minecraft client, BlockPos requested) { - if (SESSIONS.size() < MAXIMUM_PLAYERS) return true; - Session farthest = SESSIONS.values().stream().max(Comparator.comparingDouble( - session -> distanceSqr(client, session.key.pos))).orElse(null); - if (farthest == null || distanceSqr(client, requested) >= distanceSqr(client, farthest.key.pos)) return false; - remove(farthest); - return true; - } - - private static Session start(Minecraft client, ScreenKey key, Direction facing, String channel) { - Session session = new Session(key, facing, channel); - if (!initializationNoticeShown && client.player != null) { - initializationNoticeShown = true; - client.player.sendOverlayMessage(Component.translatable("message.zevent.player.initializing")); - } - DisplayScreen player = null; - try { - BlockPos anchor = ZeventScreenLayout.anchor(key.pos, facing); - UUID displayId = UUID.nameUUIDFromBytes(("zevent:" + key.dimension.identifier() + ":" + key.pos.asLong()) - .getBytes(StandardCharsets.UTF_8)); - player = new DisplayScreen( - displayId, - client.player.getUUID(), - anchor.getX(), anchor.getY(), anchor.getZ(), - DisplayFacing.valueOf(facing.getName().toUpperCase(Locale.ROOT)), - ZeventScreenLayout.WIDTH, ZeventScreenLayout.HEIGHT, - PlaybackMode.LOCAL, 720, DisplayRotation.NONE, - key.dimension.identifier().toString()); - session.player = player; - // ZEVENT owns distance and the Minecraft Records slider; keep Dream's DSP on its legacy-gain path. - player.setAcousticsEnabled(false); - player.createTexture(); - player.loadVideo(TwitchChannel.streamUrl(channel), ""); - } catch (RuntimeException | LinkageError exception) { - if (player != null) { - try { - unregisterPlayer(player); - } catch (RuntimeException | LinkageError cleanupException) { - exception.addSuppressed(cleanupException); - } - } - session.player = null; - ZeventMod.LOGGER.error("Unable to create the native ZEVENT Twitch player", exception); - if (client.player != null) client.player.sendOverlayMessage(Component.translatable( - "message.zevent.player.unavailable", channel)); - } - return session; - } - - private static void updateVolumes(Minecraft client, long now) { - Session nearest = SESSIONS.values().stream() - .filter(session -> session.player != null && now - session.lastSeenTick <= AUDIBLE_FRESH_TICKS) - .filter(session -> distanceSqr(client, session.key.pos) <= AUDIO_DISTANCE_SQR) - .min(Comparator.comparingDouble(session -> distanceSqr(client, session.key.pos))) - .orElse(null); - for (Session session : SESSIONS.values()) { - if (session.player == null) continue; - float volume = session == nearest ? attenuatedVolume(client, session.key.pos) : 0.0F; - session.player.setVideoVolume(volume); - } - } - - private static float attenuatedVolume(Minecraft client, BlockPos pos) { - double distance = Math.sqrt(distanceSqr(client, pos)); - double attenuation = distance <= FULL_VOLUME_DISTANCE ? 1.0D - : 1.0D - (distance - FULL_VOLUME_DISTANCE) / (AUDIO_DISTANCE - FULL_VOLUME_DISTANCE); - float records = client.options.getFinalSoundSourceVolume(SoundSource.RECORDS); - return Math.clamp((float) attenuation, 0.0F, 1.0F) * records; - } - - private static double distanceSqr(Minecraft client, BlockPos pos) { - return client.player == null ? Double.POSITIVE_INFINITY - : client.player.distanceToSqr(Vec3.atCenterOf(pos)); - } - - private static void remove(Session session) { - if (SESSIONS.remove(session.key) == null) return; - if (session.player != null) { - try { - unregisterPlayer(session.player); - } catch (RuntimeException | LinkageError exception) { - ZeventMod.LOGGER.warn("Unable to close a ZEVENT Twitch player cleanly", exception); - } - session.player = null; - } - } - - private static void unregisterPlayer(DisplayScreen player) { - player.setVideoVolume(0.0F); - UUID displayId = player.getUuid(); - try { - player.unregister(); - } finally { - AudioAcousticsService acoustics = DreamServices.INSTANCE.getRegistry() - .getOrNull(AudioAcousticsServices.INSTANCE.getACOUSTICS()); - if (acoustics != null) acoustics.unregisterSource(displayId); - } - } - - private record ScreenKey(ResourceKey dimension, BlockPos pos) { - } - - private static final class Session { - private final ScreenKey key; - private final Direction facing; - private String channel; - private DisplayScreen player; - private long lastSeenTick; - private long lastRetryTick; - private boolean errorReported; - - private Session(ScreenKey key, Direction facing, String channel) { - this.key = key; - this.facing = facing; - this.channel = channel; - } - - private void changeChannel(String next) { - channel = next; - lastRetryTick = 0L; - errorReported = false; - if (player != null) player.loadVideo(TwitchChannel.streamUrl(next), ""); - } - } -} diff --git a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/network/OpenScreenOptionsPayload.java b/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/network/OpenScreenOptionsPayload.java deleted file mode 100644 index 4ada7e8..0000000 --- a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/network/OpenScreenOptionsPayload.java +++ /dev/null @@ -1,37 +0,0 @@ -package fr.koka99cab.sanctuary26.zevent.network; - -import fr.koka99cab.sanctuary26.zevent.ZeventMod; -import fr.koka99cab.sanctuary26.zevent.twitch.TwitchChannel; -import net.minecraft.core.BlockPos; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.network.protocol.common.custom.CustomPacketPayload; - -public record OpenScreenOptionsPayload(BlockPos pos, String channel, boolean writable) - implements CustomPacketPayload { - public static final Type TYPE = - new Type<>(ZeventMod.id("s2c/open_screen_options")); - public static final StreamCodec STREAM_CODEC = - StreamCodec.of(OpenScreenOptionsPayload::write, OpenScreenOptionsPayload::read); - - public OpenScreenOptionsPayload { - pos = pos == null ? BlockPos.ZERO : pos.immutable(); - channel = TwitchChannel.normalize(channel).orElse(TwitchChannel.DEFAULT); - } - - private static OpenScreenOptionsPayload read(RegistryFriendlyByteBuf buffer) { - return new OpenScreenOptionsPayload(buffer.readBlockPos(), - buffer.readUtf(TwitchChannel.MAX_NAME_LENGTH), buffer.readBoolean()); - } - - private static void write(RegistryFriendlyByteBuf buffer, OpenScreenOptionsPayload payload) { - buffer.writeBlockPos(payload.pos); - buffer.writeUtf(payload.channel, TwitchChannel.MAX_NAME_LENGTH); - buffer.writeBoolean(payload.writable); - } - - @Override - public Type type() { - return TYPE; - } -} diff --git a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/network/SaveScreenChannelPayload.java b/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/network/SaveScreenChannelPayload.java deleted file mode 100644 index 09f2a29..0000000 --- a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/network/SaveScreenChannelPayload.java +++ /dev/null @@ -1,36 +0,0 @@ -package fr.koka99cab.sanctuary26.zevent.network; - -import fr.koka99cab.sanctuary26.zevent.ZeventMod; -import fr.koka99cab.sanctuary26.zevent.twitch.TwitchChannel; -import net.minecraft.core.BlockPos; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.network.protocol.common.custom.CustomPacketPayload; - -public record SaveScreenChannelPayload(BlockPos pos, String channel) implements CustomPacketPayload { - public static final Type TYPE = - new Type<>(ZeventMod.id("c2s/save_screen_channel")); - public static final StreamCodec STREAM_CODEC = - StreamCodec.of(SaveScreenChannelPayload::write, SaveScreenChannelPayload::read); - - public SaveScreenChannelPayload { - pos = pos == null ? BlockPos.ZERO : pos.immutable(); - channel = channel == null ? "" : channel.strip(); - if (channel.length() > TwitchChannel.MAX_INPUT_LENGTH) channel = ""; - } - - private static SaveScreenChannelPayload read(RegistryFriendlyByteBuf buffer) { - return new SaveScreenChannelPayload(buffer.readBlockPos(), - buffer.readUtf(TwitchChannel.MAX_INPUT_LENGTH)); - } - - private static void write(RegistryFriendlyByteBuf buffer, SaveScreenChannelPayload payload) { - buffer.writeBlockPos(payload.pos); - buffer.writeUtf(payload.channel, TwitchChannel.MAX_INPUT_LENGTH); - } - - @Override - public Type type() { - return TYPE; - } -} diff --git a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/network/ZeventNetworking.java b/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/network/ZeventNetworking.java deleted file mode 100644 index 42a0a31..0000000 --- a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/network/ZeventNetworking.java +++ /dev/null @@ -1,57 +0,0 @@ -package fr.koka99cab.sanctuary26.zevent.network; - -import fr.koka99cab.sanctuary26.zevent.ZeventMod; -import fr.koka99cab.sanctuary26.zevent.block.ZeventScreenLayout; -import fr.koka99cab.sanctuary26.zevent.block.entity.ZeventScreenBlockEntity; -import fr.koka99cab.sanctuary26.zevent.twitch.TwitchChannel; -import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; -import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.phys.Vec3; - -public final class ZeventNetworking { - public static final int PROTOCOL_VERSION = 1; - private static final double MAX_INTERACTION_DISTANCE_SQR = 64.0D; - private static boolean initialized; - - private ZeventNetworking() { - } - - public static void initialize() { - if (initialized) return; - initialized = true; - PayloadTypeRegistry.clientboundPlay().register(OpenScreenOptionsPayload.TYPE, - OpenScreenOptionsPayload.STREAM_CODEC); - PayloadTypeRegistry.serverboundPlay().register(SaveScreenChannelPayload.TYPE, - SaveScreenChannelPayload.STREAM_CODEC); - ServerPlayNetworking.registerGlobalReceiver(SaveScreenChannelPayload.TYPE, (payload, context) -> - context.server().execute(() -> saveChannel(context.player(), payload))); - } - - public static void openOptions(ServerPlayer player, ZeventScreenBlockEntity screen) { - if (player.distanceToSqr(Vec3.atCenterOf(screen.getBlockPos())) > MAX_INTERACTION_DISTANCE_SQR - || !ServerPlayNetworking.canSend(player, OpenScreenOptionsPayload.TYPE)) return; - ServerPlayNetworking.send(player, new OpenScreenOptionsPayload( - screen.getBlockPos(), screen.channel(), screen.writable())); - } - - private static void saveChannel(ServerPlayer player, SaveScreenChannelPayload payload) { - if (player.distanceToSqr(Vec3.atCenterOf(payload.pos())) > MAX_INTERACTION_DISTANCE_SQR) { - player.sendOverlayMessage(Component.translatable("message.zevent.screen.too_far")); - return; - } - if (!(player.level().getBlockEntity(payload.pos()) instanceof ZeventScreenBlockEntity screen) - || !ZeventScreenLayout.isController(screen.getBlockState())) { - player.sendOverlayMessage(Component.translatable("message.zevent.screen.missing")); - return; - } - String normalized = TwitchChannel.normalize(payload.channel()).orElse(null); - if (normalized == null) return; - if (!screen.setChannel(normalized)) { - player.sendOverlayMessage(Component.translatable("message.zevent.screen.newer_data")); - return; - } - player.sendOverlayMessage(Component.translatable("screen.zevent.options.saved")); - } -} diff --git a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/registry/ZeventRegistries.java b/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/registry/ZeventRegistries.java deleted file mode 100644 index 22108bc..0000000 --- a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/registry/ZeventRegistries.java +++ /dev/null @@ -1,69 +0,0 @@ -package fr.koka99cab.sanctuary26.zevent.registry; - -import fr.koka99cab.sanctuary26.zevent.ZeventMod; -import fr.koka99cab.sanctuary26.zevent.block.ZeventScreenBlock; -import fr.koka99cab.sanctuary26.zevent.block.entity.ZeventScreenBlockEntity; -import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; -import net.minecraft.core.Registry; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.core.registries.Registries; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.Identifier; -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.state.BlockBehaviour; -import net.minecraft.world.level.material.MapColor; - -public final class ZeventRegistries { - private static final Identifier SCREEN_ID = ZeventMod.id("zevent_screen"); - public static final ZeventScreenBlock ZEVENT_SCREEN = Registry.register( - BuiltInRegistries.BLOCK, - blockKey(SCREEN_ID), - new ZeventScreenBlock(BlockBehaviour.Properties.of() - .mapColor(MapColor.COLOR_BLACK) - .strength(3.5F, 8.0F) - .sound(SoundType.METAL) - .noOcclusion() - .setId(blockKey(SCREEN_ID))) - ); - public static final Item ZEVENT_SCREEN_ITEM = Registry.register( - BuiltInRegistries.ITEM, - itemKey(SCREEN_ID), - new BlockItem(ZEVENT_SCREEN, new Item.Properties().useBlockDescriptionPrefix().setId(itemKey(SCREEN_ID))) - ); - public static final BlockEntityType ZEVENT_SCREEN_BLOCK_ENTITY = Registry.register( - BuiltInRegistries.BLOCK_ENTITY_TYPE, - ZeventMod.id("zevent_screen"), - FabricBlockEntityTypeBuilder.create(ZeventScreenBlockEntity::new, ZEVENT_SCREEN).build() - ); - public static final CreativeModeTab CREATIVE_TAB = Registry.register( - BuiltInRegistries.CREATIVE_MODE_TAB, - ResourceKey.create(Registries.CREATIVE_MODE_TAB, ZeventMod.id("zevent")), - CreativeModeTab.builder(CreativeModeTab.Row.TOP, 0) - .title(Component.translatable("itemGroup.zevent.zevent")) - .icon(() -> new ItemStack(ZEVENT_SCREEN_ITEM)) - .displayItems((parameters, output) -> output.accept(ZEVENT_SCREEN_ITEM)) - .build() - ); - - private ZeventRegistries() { - } - - public static void initialize() { - // Class initialization owns all registry writes. - } - - private static ResourceKey blockKey(Identifier id) { - return ResourceKey.create(Registries.BLOCK, id); - } - - private static ResourceKey itemKey(Identifier id) { - return ResourceKey.create(Registries.ITEM, id); - } -} diff --git a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/twitch/TwitchChannel.java b/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/twitch/TwitchChannel.java deleted file mode 100644 index 7870724..0000000 --- a/zevent/src/main/java/fr/koka99cab/sanctuary26/zevent/twitch/TwitchChannel.java +++ /dev/null @@ -1,63 +0,0 @@ -package fr.koka99cab.sanctuary26.zevent.twitch; - -import java.net.URI; -import java.util.Locale; -import java.util.Optional; -import java.util.regex.Pattern; - -/** Converts user input to the only external identifier the server persists. */ -public final class TwitchChannel { - public static final String DEFAULT = "zeventfr"; - public static final int MAX_INPUT_LENGTH = 128; - public static final int MAX_NAME_LENGTH = 25; - private static final Pattern NAME = Pattern.compile("[a-z0-9_]{1," + MAX_NAME_LENGTH + "}"); - - private TwitchChannel() { - } - - public static Optional normalize(String input) { - if (input == null) return Optional.empty(); - String candidate = input.strip().toLowerCase(Locale.ROOT); - if (candidate.isEmpty() || candidate.length() > MAX_INPUT_LENGTH) return Optional.empty(); - - if (candidate.startsWith("@")) candidate = candidate.substring(1); - if (candidate.startsWith("twitch.tv/") || candidate.startsWith("www.twitch.tv/")) { - candidate = "https://" + candidate; - } - if (candidate.startsWith("http://") || candidate.startsWith("https://")) { - candidate = channelFromUrl(candidate).orElse(""); - } - int query = candidate.indexOf('?'); - if (query >= 0) candidate = candidate.substring(0, query); - int fragment = candidate.indexOf('#'); - if (fragment >= 0) candidate = candidate.substring(0, fragment); - candidate = candidate.replaceAll("^/+|/+$", ""); - return NAME.matcher(candidate).matches() ? Optional.of(candidate) : Optional.empty(); - } - - public static boolean valid(String channel) { - return channel != null && NAME.matcher(channel).matches(); - } - - public static String streamUrl(String channel) { - if (!valid(channel)) throw new IllegalArgumentException("Invalid Twitch channel"); - return "https://www.twitch.tv/" + channel; - } - - private static Optional channelFromUrl(String input) { - try { - URI uri = URI.create(input); - String host = uri.getHost(); - if (host == null || !(host.equals("twitch.tv") || host.equals("www.twitch.tv"))) { - return Optional.empty(); - } - String path = uri.getPath(); - if (path == null) return Optional.empty(); - String[] parts = path.split("/"); - for (String part : parts) if (!part.isBlank()) return Optional.of(part); - } catch (IllegalArgumentException ignored) { - // Invalid URLs are rejected by the common name validation below. - } - return Optional.empty(); - } -} diff --git a/zevent/src/main/resources/assets/zevent/blockstates/zevent_screen.json b/zevent/src/main/resources/assets/zevent/blockstates/zevent_screen.json deleted file mode 100644 index 82ea0e4..0000000 --- a/zevent/src/main/resources/assets/zevent/blockstates/zevent_screen.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "multipart": [ - { "when": { "facing": "north" }, "apply": { "model": "zevent:block/zevent_screen" } }, - { "when": { "facing": "east" }, "apply": { "model": "zevent:block/zevent_screen", "y": 90 } }, - { "when": { "facing": "south" }, "apply": { "model": "zevent:block/zevent_screen", "y": 180 } }, - { "when": { "facing": "west" }, "apply": { "model": "zevent:block/zevent_screen", "y": 270 } } - ] -} diff --git a/zevent/src/main/resources/assets/zevent/icon.png b/zevent/src/main/resources/assets/zevent/icon.png deleted file mode 100644 index bb44706921d189270a5748df2b219542d8e4902c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21774 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 diff --git a/zevent/src/main/resources/assets/zevent/items/zevent_screen.json b/zevent/src/main/resources/assets/zevent/items/zevent_screen.json deleted file mode 100644 index 0ef0d1a..0000000 --- a/zevent/src/main/resources/assets/zevent/items/zevent_screen.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "zevent:block/zevent_screen" - } -} diff --git a/zevent/src/main/resources/assets/zevent/lang/en_us.json b/zevent/src/main/resources/assets/zevent/lang/en_us.json deleted file mode 100644 index ba2bff8..0000000 --- a/zevent/src/main/resources/assets/zevent/lang/en_us.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "mod.zevent.description": "Streams ZEVENT Twitch channels on a 9x5 wall screen.", - "itemGroup.zevent.zevent": "ZEVENT", - "block.zevent.zevent_screen": "9x5 ZEVENT Screen", - "screen.zevent.options.title": "ZEVENT Screen", - "screen.zevent.options.channel": "Twitch channel", - "screen.zevent.options.hint": "Name or twitch.tv/channel URL", - "screen.zevent.options.official": "Official ZEVENT", - "screen.zevent.options.zerator": "ZeratoR", - "screen.zevent.options.current": "Now playing: twitch.tv/%s", - "screen.zevent.options.invalid": "Invalid channel name (1–25 characters: a-z, 0-9, _).", - "screen.zevent.options.saved": "Twitch channel updated.", - "message.zevent.screen.too_far": "You are too far away from the screen.", - "message.zevent.screen.missing": "The ZEVENT screen no longer exists.", - "message.zevent.screen.newer_data": "This screen uses newer data and is read-only.", - "message.zevent.player.initializing": "Initializing the Twitch decoder…", - "message.zevent.player.unavailable": "Channel twitch.tv/%s is offline or temporarily unavailable." -} diff --git a/zevent/src/main/resources/assets/zevent/lang/fr_fr.json b/zevent/src/main/resources/assets/zevent/lang/fr_fr.json deleted file mode 100644 index 68ba68a..0000000 --- a/zevent/src/main/resources/assets/zevent/lang/fr_fr.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "mod.zevent.description": "Diffuse des chaînes Twitch du ZEVENT sur un écran mural 9×5.", - "itemGroup.zevent.zevent": "ZEVENT", - "block.zevent.zevent_screen": "Écran ZEVENT 9×5", - "screen.zevent.options.title": "Écran ZEVENT", - "screen.zevent.options.channel": "Chaîne Twitch", - "screen.zevent.options.hint": "Nom ou URL twitch.tv/chaine", - "screen.zevent.options.official": "ZEVENT officiel", - "screen.zevent.options.zerator": "ZeratoR", - "screen.zevent.options.current": "Diffusion actuelle : twitch.tv/%s", - "screen.zevent.options.invalid": "Nom de chaîne invalide (1–25 caractères : a-z, 0-9, _).", - "screen.zevent.options.saved": "Chaîne Twitch mise à jour.", - "message.zevent.screen.too_far": "Tu es trop loin de l'écran.", - "message.zevent.screen.missing": "L'écran ZEVENT n'existe plus.", - "message.zevent.screen.newer_data": "Cet écran utilise des données plus récentes et reste en lecture seule.", - "message.zevent.player.initializing": "Initialisation du décodeur Twitch…", - "message.zevent.player.unavailable": "La chaîne twitch.tv/%s est hors ligne ou momentanément inaccessible." -} diff --git a/zevent/src/main/resources/assets/zevent/lang/ru_ru.json b/zevent/src/main/resources/assets/zevent/lang/ru_ru.json deleted file mode 100644 index 8e6615d..0000000 --- a/zevent/src/main/resources/assets/zevent/lang/ru_ru.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "mod.zevent.description": "Транслирует Twitch-каналы ZEVENT на настенном экране 9×5.", - "itemGroup.zevent.zevent": "ZEVENT", - "block.zevent.zevent_screen": "Экран ZEVENT 9×5", - "screen.zevent.options.title": "Экран ZEVENT", - "screen.zevent.options.channel": "Канал Twitch", - "screen.zevent.options.hint": "Имя или URL twitch.tv/channel", - "screen.zevent.options.official": "Официальный ZEVENT", - "screen.zevent.options.zerator": "ZeratoR", - "screen.zevent.options.current": "Сейчас: twitch.tv/%s", - "screen.zevent.options.invalid": "Неверное имя канала (1–25 символов: a-z, 0-9, _).", - "screen.zevent.options.saved": "Канал Twitch обновлён.", - "message.zevent.screen.too_far": "Вы слишком далеко от экрана.", - "message.zevent.screen.missing": "Экран ZEVENT больше не существует.", - "message.zevent.screen.newer_data": "Этот экран использует более новые данны и доступен только для чтения.", - "message.zevent.player.initializing": "Инициализация декодера Twitch…", - "message.zevent.player.unavailable": "Канал twitch.tv/%s не в сети или временно недоступен." -} diff --git a/zevent/src/main/resources/assets/zevent/models/block/zevent_screen.json b/zevent/src/main/resources/assets/zevent/models/block/zevent_screen.json deleted file mode 100644 index 2ccf859..0000000 --- a/zevent/src/main/resources/assets/zevent/models/block/zevent_screen.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "parent": "minecraft:block/block", - "textures": { - "particle": "minecraft:block/black_concrete", - "screen": "minecraft:block/black_concrete" - }, - "elements": [ - { - "from": [0, 0, 14], - "to": [16, 16, 16], - "faces": { - "north": { "texture": "#screen", "cullface": "north" }, - "south": { "texture": "#screen", "cullface": "south" }, - "west": { "texture": "#screen", "cullface": "west" }, - "east": { "texture": "#screen", "cullface": "east" }, - "up": { "texture": "#screen", "cullface": "up" }, - "down": { "texture": "#screen", "cullface": "down" } - } - } - ] -} diff --git a/zevent/src/main/resources/data/zevent/loot_table/blocks/zevent_screen.json b/zevent/src/main/resources/data/zevent/loot_table/blocks/zevent_screen.json deleted file mode 100644 index 25681e1..0000000 --- a/zevent/src/main/resources/data/zevent/loot_table/blocks/zevent_screen.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "rolls": 1, - "entries": [ - { - "type": "minecraft:item", - "name": "zevent:zevent_screen" - } - ], - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ] - } - ], - "random_sequence": "zevent:blocks/zevent_screen" -} diff --git a/zevent/src/main/resources/data/zevent/recipe/zevent_screen.json b/zevent/src/main/resources/data/zevent/recipe/zevent_screen.json deleted file mode 100644 index f688811..0000000 --- a/zevent/src/main/resources/data/zevent/recipe/zevent_screen.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "building", - "pattern": [ - "BBB", - "GTG", - "BRB" - ], - "key": { - "B": "minecraft:black_concrete", - "G": "minecraft:tinted_glass", - "T": "minecraft:redstone_torch", - "R": "minecraft:redstone_block" - }, - "result": { - "id": "zevent:zevent_screen", - "count": 1 - } -} diff --git a/zevent/src/main/resources/fabric.mod.json b/zevent/src/main/resources/fabric.mod.json deleted file mode 100644 index 50de79f..0000000 --- a/zevent/src/main/resources/fabric.mod.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "schemaVersion": 1, - "id": "zevent", - "version": "${version}", - "name": "ZEVENT", - "description": "Watch ZEVENT Twitch channels on a 9x5 in-world screen.", - "authors": [ - "KOKA99CAB" - ], - "license": "GPL-3.0-or-later", - "icon": "assets/zevent/icon.png", - "environment": "*", - "entrypoints": { - "main": [ - "fr.koka99cab.sanctuary26.zevent.ZeventMod" - ], - "client": [ - "fr.koka99cab.sanctuary26.zevent.client.ZeventClient" - ] - }, - "depends": { - "fabricloader": ">=0.19.3", - "minecraft": "~26.2", - "java": ">=25", - "fabric-api": ">=0.159.0+26.2", - "dreamdisplays": ">=1.9.6" - }, - "custom": { - "sanctuary26": { - "system_type": "server-authoritative-screen", - "namespace": "zevent", - "data_version": 1, - "network_protocol": 1, - "lifecycle": "${lifecycle}", - "pack_version": "${pack_version}", - "distribution": "temporary-weekend-pack-module", - "descriptions": { - "fr_fr": "Diffuse des chaînes Twitch du ZEVENT sur un écran mural 9×5.", - "en_us": "Streams ZEVENT Twitch channels on a 9x5 wall screen.", - "ru_ru": "Транслирует Twitch-каналы ZEVENT на настенном экране 9×5." - } - } - } -} diff --git a/zevent/src/test/java/fr/koka99cab/sanctuary26/zevent/block/ZeventScreenLayoutTest.java b/zevent/src/test/java/fr/koka99cab/sanctuary26/zevent/block/ZeventScreenLayoutTest.java deleted file mode 100644 index 3a7ce9b..0000000 --- a/zevent/src/test/java/fr/koka99cab/sanctuary26/zevent/block/ZeventScreenLayoutTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package fr.koka99cab.sanctuary26.zevent.block; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import org.junit.jupiter.api.Test; - -class ZeventScreenLayoutTest { - @Test - void mediaAnchorAlwaysCoversTheCompleteNineByFiveScreen() { - BlockPos controller = new BlockPos(20, 70, -10); - for (Direction facing : Direction.Plane.HORIZONTAL) { - BlockPos anchor = ZeventScreenLayout.anchor(controller, facing); - for (int column = 0; column < ZeventScreenLayout.WIDTH; column++) { - for (int row = 0; row < ZeventScreenLayout.HEIGHT; row++) { - BlockPos part = ZeventScreenLayout.partPos(controller, facing, column, row); - assertTrue(part.getY() >= anchor.getY()); - assertTrue(part.getY() < anchor.getY() + ZeventScreenLayout.HEIGHT); - if (facing.getAxis() == Direction.Axis.Z) { - assertTrue(part.getX() >= anchor.getX()); - assertTrue(part.getX() < anchor.getX() + ZeventScreenLayout.WIDTH); - assertEquals(anchor.getZ(), part.getZ()); - } else { - assertTrue(part.getZ() >= anchor.getZ()); - assertTrue(part.getZ() < anchor.getZ() + ZeventScreenLayout.WIDTH); - assertEquals(anchor.getX(), part.getX()); - } - } - } - } - } -} diff --git a/zevent/src/test/java/fr/koka99cab/sanctuary26/zevent/twitch/TwitchChannelTest.java b/zevent/src/test/java/fr/koka99cab/sanctuary26/zevent/twitch/TwitchChannelTest.java deleted file mode 100644 index 7abc1ba..0000000 --- a/zevent/src/test/java/fr/koka99cab/sanctuary26/zevent/twitch/TwitchChannelTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package fr.koka99cab.sanctuary26.zevent.twitch; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import org.junit.jupiter.api.Test; - -class TwitchChannelTest { - @Test - void normalizesNamesAndOfficialUrls() { - assertEquals("zeventfr", TwitchChannel.normalize(" @ZEventFR ").orElseThrow()); - assertEquals("zerator", TwitchChannel.normalize("https://www.twitch.tv/ZeratoR/videos").orElseThrow()); - assertEquals("etoiles", TwitchChannel.normalize("twitch.tv/etoiles?ref=test").orElseThrow()); - } - - @Test - void rejectsForeignUrlsAndUnboundedNames() { - assertTrue(TwitchChannel.normalize("https://example.com/zeventfr").isEmpty()); - assertTrue(TwitchChannel.normalize("bad-channel!").isEmpty()); - assertTrue(TwitchChannel.normalize("a".repeat(TwitchChannel.MAX_NAME_LENGTH + 1)).isEmpty()); - } - - @Test - void buildsOnlyValidatedPlaybackUrls() { - assertEquals("https://www.twitch.tv/zeventfr", TwitchChannel.streamUrl("zeventfr")); - org.junit.jupiter.api.Assertions.assertThrows(IllegalArgumentException.class, - () -> TwitchChannel.streamUrl("bad-channel!")); - } -} -- 2.54.0