fix(canaplia): restaurer les pages vanilla
Verification 26.2 / check (pull_request) Canceled after 0s

This commit is contained in:
2026-08-29 18:07:31 +02:00
parent b121606b4e
commit b9aabae914
7 changed files with 33 additions and 61 deletions
+1 -1
View File
@@ -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.
+7
View File
@@ -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 laffichage 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 lalpha.209.
+8 -8
View File
@@ -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"
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+11 -7
View File
@@ -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"]
@@ -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;
}