From b9aabae91452af7b25a6a2c019a8b59fa6bda551 Mon Sep 17 00:00:00 2001 From: koka Date: Sat, 29 Aug 2026 18:07:31 +0200 Subject: [PATCH] fix(canaplia): restaurer les pages vanilla --- CANAPLIA.md | 2 +- CHANGELOG.md | 7 +++ build.gradle | 16 +++---- gradle.properties | 2 +- itsalive/README.md | 2 +- itsalive/build.gradle | 18 ++++--- .../canaplia/client/CanapliaCodexScreen.java | 47 ++----------------- 7 files changed, 33 insertions(+), 61 deletions(-) diff --git a/CANAPLIA.md b/CANAPLIA.md index 3d216f0..a88b95a 100644 --- a/CANAPLIA.md +++ b/CANAPLIA.md @@ -34,7 +34,7 @@ Ambiance possède les trois payloads historiques canaplia:hemp_visual_sync, cana Les monstres tués par un joueur peuvent laisser une `canaplia:codex_page` et, très rarement, le `canaplia:codex` complet. Quatre pages récupérées permettent aussi d'assembler le Livre interdit autour d'un livre vanilla. Un clic droit sur une page découvre au hasard une entrée encore inconnue et ne consomme la page qu'en cas de nouvelle découverte. -L'ID historique `canaplia:codex` est conservé, mais l'objet s'affiche désormais comme le « Livre interdit » : il utilise la couleur du livre enchanté, ouvre directement les seize entrées et les présente sur des pages noires. En main, son contenu est strictement personnel. Posé sur un pupitre, il est temporairement inscrit au nom du joueur qui le pose et partage ses découvertes avec tous les lecteurs ; le récupérer en s'accroupissant ou casser le pupitre efface cette inscription. +L'ID historique `canaplia:codex` est conservé, mais l'objet s'affiche désormais comme le « Livre interdit » : il utilise la couleur du livre enchanté, ouvre directement les seize entrées et les présente sur les pages claires du livre vanilla. En main, son contenu est strictement personnel. Posé sur un pupitre, il est temporairement inscrit au nom du joueur qui le pose et partage ses découvertes avec tous les lecteurs ; le récupérer en s'accroupissant ou casser le pupitre efface cette inscription. Les données `canaplia:codex` restent en version 1. Les clés futures syntaxiquement valides et l'ancien champ partagé restent conservés lors d'un aller-retour afin qu'une migration ne perde aucune découverte, mais les nouvelles découvertes ne sont plus publiées globalement. Aucun payload de découverte n'est accepté du client vers le serveur et le protocole It's Alive reste en version 4. diff --git a/CHANGELOG.md b/CHANGELOG.md index ffe1238..42e7c00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ Ce journal suit les **versions du modpack**. Lorsqu'un seul module change, sa ve - Depuis `26.2.0-alpha.6`, le pack et les modules ont des versions indépendantes. I Like To Move It et Only Fun deviennent les cinquième et sixième modules actifs dans l'alpha 46. - Les versions ci-dessous ont été reconstituées à partir des JAR archivés, des packs locaux et du code source actuel. Les dates n'étant pas enregistrées de manière fiable, elles ne sont pas inventées. +## Non distribué + +Module modifié : **It's Alive `0.0.0-alpha.36`**. Le pack distribué reste en `26.2.0-alpha.210` jusqu’à la prochaine release. + +- remplace les pages noires du Livre interdit par l’affichage clair du livre vanilla ; +- conserve les seize entrées, les découvertes personnelles, le partage sur pupitre, les IDs, les données v3 et le protocole réseau 4. + ## `26.2.0-alpha.210` Modules modifiés : **Sanctuary `0.0.0-alpha.118`**, **Only Fun `0.0.0-alpha.21`**, **I Like To Move It `0.0.0-alpha.15`** et **It's Alive `0.0.0-alpha.35`**. Les six autres modules conservent leur version issue de l’alpha.209. diff --git a/build.gradle b/build.gradle index a0f1877..acd66f7 100644 --- a/build.gradle +++ b/build.gradle @@ -4172,7 +4172,7 @@ tasks.register("verifyCuisineCropsRelease") { def rice = file("itsalive/src/main/java/fr/koka99cab/sanctuary26/itsalive/agriculture/RiceCropBlock.java").text def bean = file("itsalive/src/main/java/fr/koka99cab/sanctuary26/itsalive/agriculture/BeanCropBlock.java").text if (rootProject.pack_version != "26.2.0-alpha.210" - || rootProject.itsalive_version != "0.0.0-alpha.35" + || rootProject.itsalive_version != "0.0.0-alpha.36" || release.pack_version != rootProject.pack_version || index.versionId != rootProject.pack_version || migration.source?.pack_version != "26.2.0-alpha.193" || migration.source?.modules != [itsalive: "0.0.0-alpha.26"] @@ -4313,7 +4313,7 @@ tasks.register("verifyQuestRequestsCauldronBatchesRelease") { def packwiz = file("pack/packwiz/pack.toml").text def sanctuaryManifest = new JsonSlurper().parse(file("sanctuary/src/main/resources/fabric.mod.json")) if (rootProject.pack_version != "26.2.0-alpha.210" - || rootProject.itsalive_version != "0.0.0-alpha.35" + || rootProject.itsalive_version != "0.0.0-alpha.36" || rootProject.sanctuary_version != "0.0.0-alpha.118" || migration.source?.pack_version != "26.2.0-alpha.196" || migration.target?.pack_version != "26.2.0-alpha.197" @@ -4363,7 +4363,7 @@ tasks.register("verifyFermentationBarrelAutomationRelease") { def packwizIndex = file("pack/packwiz/index.toml").text def itsAliveManifest = new JsonSlurper().parse(file("itsalive/src/main/resources/fabric.mod.json")) if (rootProject.pack_version != "26.2.0-alpha.210" - || rootProject.itsalive_version != "0.0.0-alpha.35" + || rootProject.itsalive_version != "0.0.0-alpha.36" || migration.source?.pack_version != "26.2.0-alpha.197" || migration.target?.pack_version != "26.2.0-alpha.198" || migration.target?.modules != [itsalive: "0.0.0-alpha.30", sanctuary: "0.0.0-alpha.114"] @@ -4413,7 +4413,7 @@ tasks.register("verifyQuestRequestContractsRelease") { def packwizIndex = file("pack/packwiz/index.toml").text def sanctuaryManifest = new JsonSlurper().parse(file("sanctuary/src/main/resources/fabric.mod.json")) if (rootProject.pack_version != "26.2.0-alpha.210" - || rootProject.itsalive_version != "0.0.0-alpha.35" + || rootProject.itsalive_version != "0.0.0-alpha.36" || rootProject.sanctuary_version != "0.0.0-alpha.118" || migration.source?.pack_version != "26.2.0-alpha.198" || migration.source?.modules?.sanctuary != "0.0.0-alpha.114" @@ -4589,7 +4589,7 @@ tasks.register("verifyWaystoneShopCulinaryAlpha202Release") { "sanctuary/src/main/resources/fabric.mod.json")) if (rootProject.pack_version != "26.2.0-alpha.210" || rootProject.anotherworld_version != "0.0.0-alpha.55" - || rootProject.itsalive_version != "0.0.0-alpha.35" + || rootProject.itsalive_version != "0.0.0-alpha.36" || rootProject.iliketomoveit_version != "0.0.0-alpha.15" || rootProject.sanctuary_version != "0.0.0-alpha.118" || migration.source?.pack_version != "26.2.0-alpha.201" @@ -5238,7 +5238,7 @@ tasks.register("verifyCanapliaFoundation") { def visualApiSource = file( "ambiance/src/main/java/fr/koka99cab/sanctuary26/ambiance/api/visual/AmbianceVisualEffectApi.java").text if (rootProject.pack_version != "26.2.0-alpha.210" - || rootProject.itsalive_version != "0.0.0-alpha.35" + || rootProject.itsalive_version != "0.0.0-alpha.36" || rootProject.ambiance_version != "0.0.0-alpha.14" || migration.issue != 35 || migration.source?.fabric_id != "canaplia" @@ -5489,7 +5489,7 @@ tasks.register("verifyCanapliaAlpha209Release") { onlyfun: "0.0.0-alpha.20"] if (rootProject.pack_version != "26.2.0-alpha.210" || rootProject.ambiance_version != expectedTarget.ambiance - || rootProject.itsalive_version != "0.0.0-alpha.35" + || rootProject.itsalive_version != "0.0.0-alpha.36" || rootProject.onlyfun_version != "0.0.0-alpha.21" || migration.source?.pack_version != "26.2.0-alpha.207" || migration.source?.modules != expectedSource @@ -5600,7 +5600,7 @@ tasks.register("verifyAlpha210Release") { || rootProject.sanctuary_version != expectedTarget.sanctuary || rootProject.onlyfun_version != expectedTarget.onlyfun || rootProject.iliketomoveit_version != expectedTarget.iliketomoveit - || rootProject.itsalive_version != expectedTarget.itsalive + || rootProject.itsalive_version != "0.0.0-alpha.36" || migration.source?.pack_version != "26.2.0-alpha.209" || migration.source?.modules != expectedSource || migration.target?.pack_version != "26.2.0-alpha.210" diff --git a/gradle.properties b/gradle.properties index ed42ca0..ce57167 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ redstoner_version=0.0.0-alpha.10 redstoner_lifecycle=active anotherworld_version=0.0.0-alpha.55 anotherworld_lifecycle=active -itsalive_version=0.0.0-alpha.35 +itsalive_version=0.0.0-alpha.36 itsalive_lifecycle=active ouch_version=0.0.0-alpha.9 ouch_lifecycle=active diff --git a/itsalive/README.md b/itsalive/README.md index 0aded72..f015991 100644 --- a/itsalive/README.md +++ b/itsalive/README.md @@ -2,7 +2,7 @@ It's Alive possède le vivant de Sanctuary. Il enrichit directement le Creeper vanilla et accueille désormais les papillons de Pipallon, les Mooblooms fleuries et les créatures de Real Ghost — baleine volante comprise — sous un référencement unifié `itsalive:*`. -## Version courante — `0.0.0-alpha.35` +## Version courante — `0.0.0-alpha.36` ## Creepers diff --git a/itsalive/build.gradle b/itsalive/build.gradle index a6d6a23..89e3849 100644 --- a/itsalive/build.gradle +++ b/itsalive/build.gradle @@ -556,7 +556,7 @@ tasks.register("verifyItsAlive") { def climateSource = file("src/main/java/fr/koka99cab/sanctuary26/itsalive/agriculture/ClimateCropForaging.java").text def pineappleSource = file("src/main/java/fr/koka99cab/sanctuary26/itsalive/agriculture/PineappleItem.java").text def worldgenSource = file("src/main/java/fr/koka99cab/sanctuary26/itsalive/agriculture/ItsAliveAgricultureWorldGeneration.java").text - if (project.version.toString() != "0.0.0-alpha.35" + if (project.version.toString() != "0.0.0-alpha.36" || climateMigration.target?.pack_version != "26.2.0-alpha.157" || climateMigration.target?.modules?.itsalive != "0.0.0-alpha.24" || !climateSource.contains("PlayerBlockBreakEvents.AFTER.register") @@ -1313,7 +1313,7 @@ tasks.register("verifyCulinaryReliability") { } } } - if (project.version.toString() != "0.0.0-alpha.35" + if (project.version.toString() != "0.0.0-alpha.36" || migration.target?.modules?.itsalive != "0.0.0-alpha.28" || migration.culinary_fixes?.food_press_contents_destroyed_on_break != true || migration.culinary_fixes?.comparator_contract?.blocks?.size() != 6 @@ -1351,7 +1351,7 @@ tasks.register("verifyCauldronBatching") { def recipe = file("src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/recipe/CulinaryProcessRecipe.java").text def cauldron = file("src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/block/entity/CookingCauldronBlockEntity.java").text def timed = file("src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/block/entity/AbstractTimedCulinaryBlockEntity.java").text - if (project.version.toString() != "0.0.0-alpha.35" + if (project.version.toString() != "0.0.0-alpha.36" || migration.target?.modules?.itsalive != "0.0.0-alpha.29" || migration.cauldron_batches?.logical_stack_limit != 64 || migration.cauldron_batches?.identity != "same_item_same_components" @@ -1389,7 +1389,7 @@ tasks.register("verifyFermentationBarrelAutomation") { def partialMatching = file("src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/recipe/CulinaryPartialMatching.java").text def blockstate = new JsonSlurper().parse( file("src/main/resources/assets/itsalive/blockstates/fermentation_barrel.json")) - if (project.version.toString() != "0.0.0-alpha.35" + if (project.version.toString() != "0.0.0-alpha.36" || migration.source?.modules?.itsalive != "0.0.0-alpha.29" || migration.target?.modules?.itsalive != "0.0.0-alpha.30" || migration.fermentation_barrel?.maximum_units_per_input_slot != 1 @@ -1437,7 +1437,7 @@ tasks.register("verifyCulinaryLecternRelease") { [(locale): new JsonSlurper().parse(file( "src/main/resources/assets/itsalive/lang/${locale}.json"))] } - if (project.version.toString() != "0.0.0-alpha.35" + if (project.version.toString() != "0.0.0-alpha.36" || migration.target?.modules?.itsalive != "0.0.0-alpha.31" || migration.culinary_lectern?.book_tag != "minecraft:lectern_books" || migration.culinary_lectern?.owner_catalog_shared_while_placed != true @@ -1500,7 +1500,7 @@ tasks.register("verifyCanapliaForbiddenBook") { fr_fr: "Livre interdit", en_us: "Forbidden Book", ru_ru: "Запретная книга"] - if (project.version.toString() != "0.0.0-alpha.35" + if (project.version.toString() != "0.0.0-alpha.36" || !pageItem.contains("CanapliaKnowledge.learnRandomUnknown(serverPlayer)") || !knowledge.contains("unknownVariants(data.personal(player.getUUID()))") || !knowledge.contains("data.personal(inscription.ownerId())") @@ -1510,7 +1510,11 @@ tasks.register("verifyCanapliaForbiddenBook") { || !lectern.contains("PlayerBlockBreakEvents.BEFORE.register") || !lectern.contains("CanapliaKnowledge.open(serverPlayer, book)") || !lectern.contains("CanapliaKnowledge.forgetInscription(taken)") - || !screen.contains("PAGE_BACKGROUND = 0xFF09070E") + || screen.contains("PAGE_BACKGROUND") + || screen.contains("extractBackground(GuiGraphicsExtractor") + || screen.contains("extractRenderState(GuiGraphicsExtractor") + || !screen.contains("ChatFormatting.DARK_GRAY") + || !screen.contains("ChatFormatting.DARK_GREEN") || screen.contains("screen.canaplia.codex.introduction") || !components.contains('ItsAliveMod.id("canaplia_codex")') || lecternBooks["values"] != ["itsalive:culinary_recipe_book", "canaplia:codex"] diff --git a/itsalive/src/main/java/fr/koka99cab/sanctuary26/itsalive/canaplia/client/CanapliaCodexScreen.java b/itsalive/src/main/java/fr/koka99cab/sanctuary26/itsalive/canaplia/client/CanapliaCodexScreen.java index 30772df..fa45e6a 100644 --- a/itsalive/src/main/java/fr/koka99cab/sanctuary26/itsalive/canaplia/client/CanapliaCodexScreen.java +++ b/itsalive/src/main/java/fr/koka99cab/sanctuary26/itsalive/canaplia/client/CanapliaCodexScreen.java @@ -5,17 +5,12 @@ import fr.koka99cab.sanctuary26.itsalive.network.CanapliaCodexPayload; import java.util.ArrayList; import java.util.List; import net.minecraft.ChatFormatting; -import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.screens.inventory.BookViewScreen; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; /** Vanilla book presentation of the server-authored Canaplia catalogue. */ public final class CanapliaCodexScreen extends BookViewScreen { - private static final int PAGE_BACKGROUND = 0xFF09070E; - private static final int PAGE_BORDER = 0xFF5B3268; - private int displayedPage; - public CanapliaCodexScreen(CanapliaCodexPayload snapshot) { super(new BookAccess(pages(snapshot))); } @@ -29,40 +24,6 @@ public final class CanapliaCodexScreen extends BookViewScreen { return List.copyOf(pages); } - @Override - public void extractBackground(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float partialTick) { - super.extractBackground(graphics, mouseX, mouseY, partialTick); - int left = (this.width - IMAGE_WIDTH) / 2; - graphics.fill(left + 18, 14, left + 174, 177, PAGE_BACKGROUND); - graphics.outline(left + 18, 14, 156, 163, PAGE_BORDER); - } - - @Override - public void extractRenderState(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float partialTick) { - super.extractRenderState(graphics, mouseX, mouseY, partialTick); - graphics.nextStratum(); - int left = (this.width - IMAGE_WIDTH) / 2; - graphics.fill(left + 94, 14, left + 174, 27, PAGE_BACKGROUND); - graphics.text(this.font, Component.translatable("screen.canaplia.codex.page", - displayedPage + 1, CanapliaVariantKey.values().length), left + 99, 18, 0xFFE3C7ED); - } - - @Override - public boolean setPage(int page) { - displayedPage = Math.clamp(page, 0, CanapliaVariantKey.values().length - 1); - return super.setPage(page); - } - - @Override - protected void pageBack() { - setPage(displayedPage - 1); - } - - @Override - protected void pageForward() { - setPage(displayedPage + 1); - } - private static Component variantPage(CanapliaCodexPayload snapshot, CanapliaVariantKey variant, int index) { boolean personal = bit(snapshot.personalMask(), index); @@ -71,22 +32,22 @@ public final class CanapliaCodexScreen extends BookViewScreen { boolean conditionHint = bit(snapshot.conditionHintMask(), index); MutableComponent page = Component.translatable("screen.canaplia.codex.entry_number", index + 1) - .withStyle(ChatFormatting.LIGHT_PURPLE).append("\n\n"); + .withStyle(ChatFormatting.DARK_GRAY).append("\n\n"); if (!personal && !shared) { return page.append(Component.translatable("screen.canaplia.codex.hidden") .withStyle(ChatFormatting.GRAY)); } page.append(Component.translatable("variant.canaplia." + variant.key()) - .withStyle(personal ? ChatFormatting.GREEN : ChatFormatting.LIGHT_PURPLE)); + .withStyle(personal ? ChatFormatting.DARK_GREEN : ChatFormatting.DARK_PURPLE)); if (personal || shared || originHint) { page.append("\n\n").append(Component.translatable("screen.canaplia.codex.origin", Component.translatable("origin.canaplia." + variant.key())) - .withStyle(ChatFormatting.GRAY)); + .withStyle(ChatFormatting.DARK_GRAY)); } if (personal || shared || conditionHint) { page.append("\n\n").append(Component.translatable("hint.canaplia." + variant.key()) - .withStyle(ChatFormatting.GRAY)); + .withStyle(ChatFormatting.DARK_GRAY)); } return page; }