From 71fdcdfeb8e8aabed183bed65239b79f8708c738 Mon Sep 17 00:00:00 2001 From: mathi Date: Thu, 6 Aug 2026 14:57:28 +0200 Subject: [PATCH 01/33] feat(reactor): port lot 0 - prerequisites for the Forge reactor logic Groundwork required before porting the reactor's logic layer (services, reactorLogic, consumable, snapshot, display) from the Forge branch. None of it compiles without these five prerequisites. - CReactorHeat: new config holding the DANGER heat thresholds per reactor size (5x5 / 7x7 / 9x9), wired into CNCServer. - CRods: add the uranium/graphite/thorium proximity, base and ratio values the heat model reads. Existing key names are kept so current configs are not reset. - RodType: numeric values become Suppliers so they are re-read from the config at runtime instead of being frozen at registration, as on Forge. Adds ratio() (weight used by the fuel/cooler thermal balance), the isFuel/isCooled overloads taking a resolved RodType, and the level-aware tooltipKey. Drops the useConfig machinery: its three switches were fully commented out, so it always returned the default value, and nothing called setRodConfig(). - IHeat.HeatLevel: thresholds now depend on the reactor size, plus isNotDanger() and the BigItemStack overload. - ReactorControllerBlock: add the ACTIVE property, recomputed server-side every tick and synced to the client. It drives the running-sound loop and the lit controller texture (off / standby / on) generated by ReactorControllerGenerator. Also register the RodType of URANIUM_ROD and GRAPHITE_ROD, which had none: resolveRodType() fell back to FALLBACK (type NONE), which the heat calculator skips, so the ported model would have computed zero heat forever without any visible error. THORIUM_ROD switches from hardcoded values to the config-backed ones. PORTAGE_REACTEUR.md documents the full gap analysis and the remaining lots. Co-Authored-By: Claude Opus 5 (1M context) --- PORTAGE_REACTEUR.md | 230 ++++++++++++++++++ .../nuclearteam/createnuclear/CNItems.java | 20 +- .../api/multiblock/rods/RodType.java | 222 ++++++++++------- .../content/multiblock/IHeat.java | 61 +++-- .../controller/ReactorControllerBlock.java | 11 +- .../ReactorControllerBlockEntity.java | 13 +- .../ReactorControllerGenerator.java | 46 +++- .../multiblock/core/ReactorCoreEntity.java | 2 +- .../infrastructure/config/CNCServer.java | 2 + .../infrastructure/config/CReactorHeat.java | 14 ++ .../infrastructure/config/CRods.java | 31 +++ 11 files changed, 532 insertions(+), 120 deletions(-) create mode 100644 PORTAGE_REACTEUR.md create mode 100644 src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CReactorHeat.java diff --git a/PORTAGE_REACTEUR.md b/PORTAGE_REACTEUR.md new file mode 100644 index 0000000..4dba924 --- /dev/null +++ b/PORTAGE_REACTEUR.md @@ -0,0 +1,230 @@ +# Portage du réacteur — Forge → NeoForge + +Comparaison `CreateNuclearForge` (branche `V2`) → `CreateNuclearNeoForge` (branche `V2`). +Périmètre : domaine réacteur uniquement (`content/multiblock/**` + dépendances directes). + +--- + +## 1. Constat central + +**Le réacteur NeoForge n'est pas une version « réorganisée » du réacteur Forge : c'est une génération antérieure du code.** + +C'est le point le plus important du rapport, parce qu'il change la nature du travail. Un portage classique consiste à traduire l'API. Ici, il faut d'abord **remplacer la logique**, puis traduire l'API. + +| | Forge | NeoForge | +|---|---|---| +| `ReactorControllerBlockEntity` | 440 lignes, logique déléguée | **735 lignes monolithiques** | +| Packages `service/`, `reactorLogic/`, `consumable/`, `snapshot/`, `display/` | 31 fichiers | **0 — inexistants** | +| Modèle thermique | équilibre 6:1 fuel/cooler, surchauffe progressive, fluide caloporteur | somme `baseUraniumHeat`/`baseGraphiteHeat` codée en dur | +| Fusion du cœur | compte à rebours 300 ticks + notifications + explosion dimensionnée | **absente** | +| Alarmes | pilotées par coordinateur + advancement | **jamais déclenchées** | +| Consommation des barres | cycles par type de barre, persistés en NBT | timers `tmpUraniumTimer`/`tmpGraphiteTimer` codés en dur | +| Son de fonctionnement | boucle pilotée par blockstate `ACTIVE` | **absent** | +| Tooltip goggles | rendu depuis un snapshot synchronisé | lit `fuelItem`/`coolerItem` locaux | + +Concrètement, le `tick()` NeoForge fait encore : lire l'inventaire d'un unique `ReactorRodInput`, décrémenter deux timers, calculer une chaleur par voisinage uranium/graphite, et faire tourner la sortie. Il n'y a ni surchauffe, ni fusion, ni explosion, ni consommation de fluide. + +**Conséquence sur la méthode :** ne pas essayer de « compléter » le BE NeoForge existant. Il faut le remplacer par la version Forge et porter les 31 fichiers de logique en dessous. Les ~300 lignes actuelles de calcul (`calculateHeat`, `calculateProgress`, `updateTimers`, `getStructureBounds`, `convertePattern`, `formattedPattern`, `rotate`) sont du code mort une fois le portage fait. + +--- + +## 2. Ce qui existe déjà côté NeoForge (bonne nouvelle) + +Toute l'infrastructure dont dépendent les services Forge est **déjà présente** : + +`RodType` · `ReactorFluidType` · `BigFluidStack` · `NotifyUtil` · `CreateNuclearLang` · `BiomeIrradiationService` · `CNBiomes` · `NuclearExplosionEntity` · `CNAdvancement` · `CNAdvancementBehaviour` · `CNConfigs` · `ReactorBluePrintItem.getItemStorage()` · `CNSoundEvents.REACTOR_RUNNING` + +Les 5 managers (`ReactorInputManager`, `ReactorOutputManager`, `ReactorInputFluidManager`, `ReactorAlarmManager`, `AbstractReactorIOManager`) sont eux aussi déjà portés et à jour. + +Le portage ne part donc pas de zéro : il porte sur la couche logique, pas sur les fondations. + +--- + +## 3. Divergences d'API bloquantes — à traiter EN PREMIER + +Ces cinq points doivent être réglés avant de porter le moindre service, sinon rien ne compile. + +### 3.1 `RodType` — modèle différent + +| Forge | NeoForge | +|---|---| +| `Holder item` (une barre par type) | `HolderSet items` (plusieurs barres par type) | +| `baseRodHeat()` → `Supplier`, appelé `.get()` | `baseRodHeat()` → `int` direct | +| `proximityRodHeat()` → `Supplier` | `proximityRodHeat()` → `float` direct | +| `rodTimer()` → `Supplier` | `rodTimer()` → `int` direct | +| **`ratio()` présent** | **`ratio()` absent** | +| `TypeRodPredicate.isFuel(RodType)` / `isCooled(RodType)` | uniquement `IS_FUEL` / `IS_COOLED` sur `ItemStack` | + +**À faire :** ajouter `ratio()` à `RodType` NeoForge (+ builder + codec + config), ajouter les surcharges `isFuel(RodType)` / `isCooled(RodType)`. Dans les services portés, supprimer les `.get()` sur `baseRodHeat`/`proximityRodHeat`/`rodTimer`. + +Le `HolderSet` au lieu du `Holder` n'est pas un problème : les services n'utilisent que `resolveRodType(Item, Level)`, dont la signature est identique des deux côtés. + +### 3.2 `IHeat.HeatLevel` — pas de notion de taille de réacteur + +| Forge | NeoForge | +|---|---| +| `of(int heat, int reactorSize)` | `of(int heat)` | +| `isNotDanger(int heat, int reactorSize)` | **absent** | +| `getFormattedHeatText(int heat, int reactorSize)` | `getFormattedHeatText(int heat)` | +| `getFormattedItemText(ItemStack, Boolean, Level)` | `getFormattedItemText(ItemStack, Boolean)` | + +Côté Forge, les seuils de danger dépendent de la taille du réacteur (5×5 / 7×7 / 9×9). C'est ce qui rend un 9×9 viable à haute chaleur. Côté NeoForge, le seuil est unique. + +**À faire :** porter la version taille-consciente de `IHeat.HeatLevel`, qui dépend du point suivant. + +### 3.3 `CReactorHeat` — fichier de config absent + +```java +public final ConfigInt size5Danger = i(256, 0, 8192, ...); +public final ConfigInt size7Danger = i(1024, 0, 8192, ...); +public final ConfigInt size9Danger = i(4096, 0, 8192, ...); +``` + +**À faire :** créer `infrastructure/config/CReactorHeat.java` et le déclarer dans `CNCServer`/`CNConfigs`. + +### 3.4 `CRods` — config incomplète + +Forge expose 12 valeurs (uranium / graphite / **thorium**, avec `*HeatRatio` et `*ProximityBonus`). NeoForge n'en expose que 3 (`uraniumRodLifetime`, `graphiteRodLifetime`, `maxHeat`) et **ne connaît pas le thorium**. + +**À faire :** aligner `CRods` sur la version Forge. Prérequis du `ratio()` de 3.1. + +### 3.5 `ReactorControllerBlock` — propriété `ACTIVE` absente + +Forge déclare `ASSEMBLED` **et** `ACTIVE`. NeoForge n'a que `ASSEMBLED`. + +`ACTIVE` est recalculée chaque tick serveur et synchronisée automatiquement au client ; c'est elle qui pilote la boucle sonore de fonctionnement. Sans elle, `ReactorRunningSoundInstance` n'a rien à observer. + +**À faire :** ajouter `ACTIVE` au blockstate + au datagen des blockstates JSON. + +--- + +## 4. Fichiers à créer — par ordre de portage + +### Lot 0 — Prérequis (rien ne compile sans) +| Fichier | Note | +|---|---| +| `infrastructure/config/CReactorHeat.java` | création | +| `infrastructure/config/CRods.java` | **extension** (thorium + ratios + proximité) | +| `api/multiblock/rods/RodType.java` | **modification** (`ratio()`, prédicats `RodType`) | +| `content/multiblock/IHeat.java` | **modification** (seuils par taille) | +| `content/multiblock/controller/ReactorControllerBlock.java` | **modification** (`ACTIVE`) | + +### Lot 1 — Modèle thermique (`reactorLogic/`, 7 fichiers, ~217 lignes) +`IHeatCalculator` · `DefaultHeatCalculator` · `IOverheatController` · `DefaultOverheatController` · `HeatBalance` · `EquilibriumState` · `HeatManager` + +Cœur du modèle : équilibre 6:1 fuel/cooler, surchauffe qui s'accélère (`overFlowLimiter` décrémenté), pénalité de fluide insuffisant ou de dépassement du `maxHeat` du fluide. + +### Lot 2 — Lecture de pattern & consommation (`consumable/`, 6 fichiers, ~317 lignes) +`PatternReader` · `IConsumable` · `ItemConsumable` · `FluidConsumable` · `ConsumableTimer` · `ConsumptionCycleManager` + +`PatternReader` est utilisé par le lot 1 et le lot 3 — à porter tôt. + +### Lot 3 — Services (`service/`, 14 fichiers, ~536 lignes) +`IHeatService` / `DefaultHeatService` · `IPersistenceService` / `DefaultPersistenceService` · `IExplosionService` / `ReactorMeltdownExecutor` · `IReactorMeltdownMonitor` / `ReactorMeltdownMonitor` · `IReactorAlarmCoordinator` / `ReactorAlarmCoordinator` · `IReactorHeatUpdateCoordinator` / `ReactorHeatUpdateCoordinator` · `IFluidConsumptionRateCalculator` / `FluidConsumptionRateCalculator` + +### Lot 4 — Affichage & snapshot (6 fichiers, ~450 lignes) +`snapshot/ReactorInputSnapshot` · `snapshot/ReactorInputSnapshotBuilder` · `display/ReactorDisplayState` · `display/ReactorGoggleTooltipRenderer` · `manager/ReactorFrameDisplayManagerI` · `manager/ReactorFrameDisplayManager` + +`ReactorFrameDisplayManager` remplace les champs `frameFluidCache*` / `frameColumn*` actuellement inlinés dans le BE NeoForge — c'est une extraction, la logique existe déjà et est équivalente. + +### Lot 5 — Divers contrôleur (2 fichiers, ~100 lignes) +`ReactorRunningSoundInstance` · `ReactorDebugDiagnostics` + +### Lot 6 — Réécriture du block entity +Remplacement de `ReactorControllerBlockEntity` (735 → ~440 lignes) et branchement de tout le reste. + +### Lot 7 — API multiblock +`api/multiblock/IMultiblockController.java` — interface implémentée par le BE Forge, absente côté NeoForge. + +--- + +## 5. Pièges de traduction 1.20.1 Forge → 1.21 NeoForge + +### 5.1 ⚠️ Le piège majeur : `getConfiguredPatternTag()` renvoie une copie + +Côté Forge, la chaleur est **écrite dans le tag de l'ItemStack** : + +```java +configuredPattern.getOrCreateTag().putDouble("heat", heat); // mute en place +``` + +Côté NeoForge, l'implémentation actuelle est : + +```java +public CompoundTag getConfiguredPatternTag() { + return this.configuredPattern + .getOrDefault(DataComponents.CUSTOM_DATA, CustomData.EMPTY) + .copyTag(); // ⚠️ COPIE +} +``` + +`copyTag()` renvoie une copie défensive. **Tout `put*` dessus est silencieusement perdu.** Traduire `ReactorHeatUpdateCoordinator.updateHeatOnly()` / `calculateAndWriteHeat()` littéralement produirait un réacteur dont la chaleur reste bloquée à 0, sans aucune erreur de compilation ni exception à l'exécution. + +Deux options : + +- **A — pansement** : après modification, réécrire le composant + `stack.set(DataComponents.CUSTOM_DATA, CustomData.of(tag))`. + Rapide, mais conserve la sémantique « NBT brut » que 1.21 cherche à supprimer. +- **B — propre (recommandé)** : introduire un `ReactorHeatData` (ou étendre `ReactorBluePrintData`, qui existe déjà comme record côté NeoForge) et remplacer les accès `tag.getDouble("heat")` par un accès typé. + +Option B est plus de travail mais s'aligne sur la direction déjà prise par le repo NeoForge, qui utilise `CNDataComponents` / `ReactorBluePrintData` / `PatternData`. Mélanger les deux approches est le vrai risque : `PatternReader` (Forge) lit `tag.getCompound("patternAll")`, alors que NeoForge stocke déjà le pattern dans `ReactorBluePrintData.patternAll()` sous forme de `PatternData[]`. + +**→ `PatternReader` ne doit pas être traduit ligne à ligne. Il doit être réécrit pour lire `ReactorBluePrintData`.** + +### 5.2 Correspondances mécaniques + +| Forge 1.20.1 | NeoForge 1.21 | +|---|---| +| `net.minecraftforge.items.IItemHandler` | `net.neoforged.neoforge.items.IItemHandler` | +| `net.minecraftforge.fluids.FluidStack` | `net.neoforged.neoforge.fluids.FluidStack` | +| `net.minecraftforge.api.distmarker.OnlyIn` | `net.neoforged.api.distmarker.OnlyIn` | +| `ForgeRegistries.ITEMS.getKey(item)` | `BuiltInRegistries.ITEM.getKey(item)` | +| `ForgeRegistries.ITEMS.getValue(rl)` | `BuiltInRegistries.ITEM.get(rl)` | +| `new ResourceLocation(s)` | `ResourceLocation.parse(s)` | +| `read/write(CompoundTag, boolean)` | `read/write(CompoundTag, HolderLookup.Provider, boolean)` | +| `handler.deserializeNBT(tag)` | `handler.deserializeNBT(provider, tag)` | +| `ItemStack.of(tag)` | `ItemStack.parse(provider, tag)` → `Optional` | +| `stack.serializeNBT()` | `stack.saveOptional(provider)` | +| `CODEC.encodeStart(..).getOrThrow(false, X::new)` | `CODEC.encodeStart(..).getOrThrow()` | + +`ReactorDisplayState` et `DefaultPersistenceService` concentrent la majorité de ces changements, car ils sérialisent tout. + +### 5.3 `FluidStack` n'est plus nullable de la même façon + +En 1.21, `FluidStack` porte des `DataComponents` et `FluidStack.EMPTY` se compare avec `isEmpty()`, jamais avec `==`. Le code Forge de `ReactorFrameDisplayManager` fait `fluid.isEmpty()` — correct — mais `stack.copy()` conserve désormais les composants, ce qui est le comportement voulu. + +--- + +## 6. Volumétrie + +| Lot | Fichiers | Lignes (Forge) | Difficulté | +|---|---|---|---| +| 0 — Prérequis | 5 (2 créés, 3 modifiés) | ~150 | moyenne | +| 1 — reactorLogic | 7 | 217 | faible (logique pure, peu d'API MC) | +| 2 — consumable | 6 | 317 | **élevée** (`PatternReader` à réécrire) | +| 3 — service | 14 | 536 | moyenne (persistence = élevée) | +| 4 — display/snapshot | 6 | 450 | **élevée** (sérialisation) | +| 5 — divers | 2 | 100 | faible | +| 6 — BlockEntity | 1 | 440 | **élevée** | +| 7 — api multiblock | 1 | ~30 | faible | +| **Total** | **42** | **~2 240** | | + +Les lots 1, 3 et 5 sont essentiellement de la traduction d'imports. Les lots 2, 4 et 6 demandent de vraies décisions d'architecture (DataComponents vs NBT). + +--- + +## 7. Recommandation d'ordre d'exécution + +1. **Lot 0** — sans lui rien ne compile. +2. **Décision DataComponents vs NBT** (§5.1) — elle conditionne les lots 2, 4 et 6. À trancher avant d'écrire une ligne du lot 2. +3. **Lots 1 → 5** dans l'ordre, en compilant après chaque lot. +4. **Lot 6** en dernier : le BE ne compile qu'une fois toutes ses dépendances présentes. +5. **Lot 7** au choix, indépendant. + +Les deux gametests Forge (`DefaultHeatCalculatorGameTest`, `ReactorInputFluidManagerGameTest`) sont à porter avec les lots 1 et 3 respectivement : ils valident précisément la logique la plus risquée. + +--- + +## 8. Hors périmètre de ce rapport + +Le reste du mod présente aussi des écarts (~40 fichiers) : sources DisplayLink, animaux irradiés, datagen de recettes, worldgen, mixins client, compat JEI/Alex's Caves. À traiter dans un second temps. \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/CNItems.java b/src/main/java/net/nuclearteam/createnuclear/CNItems.java index 8701664..9569f0b 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNItems.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNItems.java @@ -22,6 +22,7 @@ import net.nuclearteam.createnuclear.api.ItemRodTypesValue; import net.nuclearteam.createnuclear.api.data.recipe.SmithingClothRecipeBuilder; import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; +import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; import net.nuclearteam.createnuclear.content.equipment.cloth.ClothItem; import net.nuclearteam.createnuclear.content.equipment.cloth.ClothItem.Cloths; import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintItem; @@ -74,6 +75,12 @@ public class CNItems { URANIUM_ROD = CreateNuclear.REGISTRATE .item("uranium_rod", p -> new RadiationItem(p, 100)) + .onRegister(ItemRodTypesValue.setRodTypeInfos(new RodType.Builder() + .baseRodHeat(() -> CNConfigs.server().rods.uraniumBaseValue.get()) + .proximityRodHeat(() -> (float) CNConfigs.server().rods.uraniumProximityBonus.get()) + .rodTimer(() -> CNConfigs.server().rods.uraniumRodLifetime.get()) + .ratio(() -> CNConfigs.server().rods.uraniumHeatRatio.get()) + .fuelRodType())) .tag(CNTags.forgeItemTag("rods"), CNItemTags.FUEL.tag) .register(); @@ -105,6 +112,12 @@ public class CNItems { GRAPHITE_ROD = CreateNuclear.REGISTRATE .item("graphite_rod", Item::new) + .onRegister(ItemRodTypesValue.setRodTypeInfos(new RodType.Builder() + .baseRodHeat(() -> CNConfigs.server().rods.graphiteBaseValue.get()) + .proximityRodHeat(() -> CNConfigs.server().rods.graphiteProximityMalus.getF()) + .rodTimer(() -> CNConfigs.server().rods.graphiteRodLifetime.get()) + .ratio(() -> CNConfigs.server().rods.graphiteHeatRatio.get()) + .coolerRodType())) .tag(CNTags.forgeItemTag("rods"), CNItemTags.COOLER.tag) .register(), @@ -182,9 +195,10 @@ public class CNItems { THORIUM_ROD = CreateNuclear.REGISTRATE .item("thorium_rod", Item::new) .onRegister(ItemRodTypesValue.setRodTypeInfos(new RodType.Builder() - .rodTimer(3600) - .baseRodHeat(16) - .proximityRodHeat(8) + .baseRodHeat(() -> CNConfigs.server().rods.baseValueThorium.get()) + .proximityRodHeat(() -> (float) CNConfigs.server().rods.thoriumProxyBonus.get()) + .rodTimer(() -> CNConfigs.server().rods.thoriumRodLifetime.get()) + .ratio(() -> CNConfigs.server().rods.thoriumHeatRatio.get()) .fuelRodType())) .tag(CNTags.forgeItemTag("rods")) .register(), diff --git a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/rods/RodType.java b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/rods/RodType.java index 2a17dc3..f46f968 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/rods/RodType.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/rods/RodType.java @@ -18,41 +18,58 @@ import net.nuclearteam.createnuclear.api.CreateNuclearRegistries; import net.nuclearteam.createnuclear.api.ItemRodTypesValue; import net.nuclearteam.createnuclear.content.rod.CNRodTypes; -import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.function.Predicate; +import java.util.function.Supplier; /** * Represents a rod type used by the mod's multiblock. *

* A {@code RodType} holds a set of items that can represent this rod type, * heat-related values, a timing value, and a {@link TypeRod} indicating the - * category (fuel, cooler, or mixed). + * category (fuel, cooler, or none). + *

+ * Every numeric value is stored as a {@link Supplier} so it can be backed by a + * live source such as a config option: the value is re-read on each accessor + * call instead of being frozen at registration time (see {@code CNItems}). */ @MethodsReturnNonnullByDefault public record RodType(HolderSet items, - int baseRodHeat, float proximityRodHeat, - int rodTimer, TypeRod type, boolean useConfig) { + Supplier baseRodHeat, + Supplier proximityRodHeat, + Supplier rodTimer, + Supplier ratio, + TypeRod type) { public RodType(HolderSet items, int baseRodHeat, float proximityRodHeat, int rodTimer, TypeRod type) { - this(items, baseRodHeat, proximityRodHeat, rodTimer, type, false); + this(items, baseRodHeat, proximityRodHeat, rodTimer, type, 1); + } + + public RodType(HolderSet items, + int baseRodHeat, float proximityRodHeat, + int rodTimer, TypeRod type, int ratio) { + this(items, () -> baseRodHeat, () -> proximityRodHeat, () -> rodTimer, () -> ratio, type); } /** * Serialization codec for saving/loading {@link RodType} instances. + *

+ * {@code ratio} is optional and defaults to {@code 1} so datapacks written + * before it existed keep loading unchanged. */ public static final Codec CODEC = RecordCodecBuilder.create(i -> i.group( RegistryCodecs.homogeneousList(Registries.ITEM).fieldOf("items").forGetter(RodType::items), - Codec.INT.fieldOf("baseRodHeat").forGetter(RodType::baseRodHeat), - Codec.FLOAT.fieldOf("proximityRodHeat").forGetter(RodType::proximityRodHeat), - Codec.INT.fieldOf("rodTimer").forGetter(RodType::rodTimer), - StringRepresentable.fromEnum(TypeRod::values).fieldOf("type").forGetter(RodType::type) + Codec.INT.fieldOf("baseRodHeat").forGetter(rt -> rt.baseRodHeat().get()), + Codec.FLOAT.fieldOf("proximityRodHeat").forGetter(rt -> rt.proximityRodHeat().get()), + Codec.INT.fieldOf("rodTimer").forGetter(rt -> rt.rodTimer().get()), + StringRepresentable.fromEnum(TypeRod::values).fieldOf("type").forGetter(RodType::type), + Codec.INT.optionalFieldOf("ratio", 1).forGetter(rt -> rt.ratio().get()) ).apply(i, RodType::new)); /** @@ -97,7 +114,7 @@ public static RodType resolveRodType(Item item, Level world) { /** * Returns whether this {@code RodType} has no associated items. * - * @return {@code true} if no items are defined, {@code false} otherwise + * @return {@code true} if at least one item is defined, {@code false} otherwise */ public boolean isNotEmptyItem() { return this.items.size() >= 1; @@ -106,16 +123,22 @@ public boolean isNotEmptyItem() { /** * Fluent builder for creating an immutable {@link RodType} instance. *

- * Use the configuration methods and call {@link #build()} to obtain the - * resulting instance. + * Every numeric value ({@code baseRodHeat}, {@code proximityRodHeat}, + * {@code rodTimer}, {@code ratio}) can be set either as a fixed primitive + * (evaluated once, at build time) or as a {@link Supplier} (re-evaluated on + * every call to the corresponding accessor). The primitive overloads are + * pure convenience: {@code baseRodHeat(5)} is equivalent to + * {@code baseRodHeat(() -> 5)}. Use the {@link Supplier} overloads to back a + * value with a live source such as a config option, so changes are picked up + * without rebuilding the {@code RodType}. */ public static class Builder { private final List> items = new ArrayList<>(); - private int baseRodHeat = 0; - private int proximityRodHeat = 0; - private int rodTimer = 0; + private Supplier baseRodHeat = () -> 0; + private Supplier proximityRodHeat = () -> 0f; + private Supplier rodTimer = () -> 0; + private Supplier ratio = () -> 1; private TypeRod type = TypeRod.FUEL; - private boolean useConfig = false; private boolean itemsSet = false; private boolean baseRodHeatSet = false; @@ -130,6 +153,16 @@ public static class Builder { * @return this builder */ public Builder baseRodHeat(int baseRodHeat) { + return baseRodHeat(() -> baseRodHeat); + } + + /** + * Sets the base heat for the rod, backed by a live source. + * + * @param baseRodHeat supplier of the base heat value + * @return this builder + */ + public Builder baseRodHeat(Supplier baseRodHeat) { this.baseRodHeat = baseRodHeat; this.baseRodHeatSet = true; return this; @@ -141,7 +174,17 @@ public Builder baseRodHeat(int baseRodHeat) { * @param proximityRodHeat proximity heat value * @return this builder */ - public Builder proximityRodHeat(int proximityRodHeat) { + public Builder proximityRodHeat(float proximityRodHeat) { + return proximityRodHeat(() -> proximityRodHeat); + } + + /** + * Sets the heat contributed by nearby rods, backed by a live source. + * + * @param proximityRodHeat supplier of the proximity heat value + * @return this builder + */ + public Builder proximityRodHeat(Supplier proximityRodHeat) { this.proximityRodHeat = proximityRodHeat; this.proximityRodHeatSet = true; return this; @@ -154,11 +197,43 @@ public Builder proximityRodHeat(int proximityRodHeat) { * @return this builder */ public Builder rodTimer(int rodTimer) { + return rodTimer(() -> rodTimer); + } + + /** + * Sets the timer (duration) for the rod's behavior, backed by a live source. + * + * @param rodTimer supplier of the duration + * @return this builder + */ + public Builder rodTimer(Supplier rodTimer) { this.rodTimer = rodTimer; this.rodTimerSet = true; return this; } + /** + * Sets the weight this rod carries when resolving the reactor's + * fuel/cooler thermal balance (see {@code HeatBalance}). + * + * @param ratio weight of a single rod of this type + * @return this builder + */ + public Builder ratio(int ratio) { + return ratio(() -> ratio); + } + + /** + * Sets the thermal balance weight, backed by a live source. + * + * @param ratio supplier of the weight + * @return this builder + */ + public Builder ratio(Supplier ratio) { + this.ratio = ratio; + return this; + } + /** * Sets the rod type to {@link TypeRod#COOLER}. * @@ -194,11 +269,6 @@ public Builder addItems(ItemLike... items) { return this; } - public Builder setRodConfig() { - this.useConfig = true; - return this; - } - /** * Builds the immutable {@link RodType} instance. * @@ -209,70 +279,17 @@ public RodType build() { List missing = new ArrayList<>(); if (!itemsSet || items.isEmpty()) missing.add("items"); if (!typeSet) missing.add("type"); - - if (!this.useConfig) { - if (!baseRodHeatSet) missing.add("baseRodHeat"); - if (!proximityRodHeatSet) missing.add("proximityRodHeat"); - if (!rodTimerSet) missing.add("rodTimer"); - } else { - /* Lazy config resolution: don't access CNConfigs here during registration. - * The actual values will be read at runtime via the resolved* accessors. - * Only MIXTE is considered an error for "useConfig" because there are - * no configuration defaults for the mixed type. - */ -// missing.add("Configuration defaults cannot be applied to the rod type"); - } + if (!baseRodHeatSet) missing.add("baseRodHeat"); + if (!proximityRodHeatSet) missing.add("proximityRodHeat"); + if (!rodTimerSet) missing.add("rodTimer"); if (!missing.isEmpty()) throw new IllegalStateException("Missing required RodType fields: " + String.join(", ", missing)); - return new RodType(HolderSet.direct(items), baseRodHeat, proximityRodHeat, rodTimer, type, useConfig); - } - } - - @Override - public int baseRodHeat() { - if (!useConfig) return baseRodHeat; - try { - return switch (type) { - //case FUEL -> CNConfigs.server().rods.baseValueUranium.get(); - //case COOLER -> CNConfigs.server().rods.baseValueGraphite.get(); - default -> baseRodHeat; - }; - } catch (IllegalStateException e) { - return baseRodHeat; - } - } - - @Override - public float proximityRodHeat() { - if (!useConfig) return proximityRodHeat; - try { - return switch (type) { - //case FUEL -> CNConfigs.server().rods.uraniumProxyBonus.get(); - //case COOLER -> CNConfigs.server().rods.graphiteProxyMalus.getF(); - default -> proximityRodHeat; - }; - } catch (IllegalStateException e) { - return proximityRodHeat; - } - } - - @Override - public int rodTimer() { - if (!useConfig) return rodTimer; - try { - return switch (type) { - //case FUEL -> CNConfigs.server().rods.uraniumRodLifetime.get(); - //case COOLER -> CNConfigs.server().rods.graphiteRodLifetime.get(); - default -> rodTimer; - }; - } catch (IllegalStateException e) { - return rodTimer; + return new RodType(HolderSet.direct(items), baseRodHeat, proximityRodHeat, rodTimer, ratio, type); } } - public enum TypeRod implements StringRepresentable { /** * Fuel rod: generates heat via reaction. @@ -307,21 +324,58 @@ public static final class TypeRodPredicate { return IS_NOT_NULL.test(s) && (s.is(CNItemTags.COOLER.tag) || type == TypeRod.COOLER); }; + /** @return whether the given resolved rod type is a fuel rod. */ + public static boolean isFuel(RodType rodType) { + return rodType != null && rodType.type() == TypeRod.FUEL; + } + + /** @return whether the given resolved rod type is a cooler rod. */ + public static boolean isCooled(RodType rodType) { + return rodType != null && rodType.type() == TypeRod.COOLER; + } + + /** + * Level-aware variant of {@link #IS_FUEL}: resolves the rod type through + * the world registries first, so datapack-defined rod types are honoured. + */ + public static boolean isFuel(ItemStack stack, Level level) { + if (!IS_NOT_NULL.test(stack) || stack.isEmpty()) return false; + if (stack.is(CNItemTags.FUEL.tag)) return true; + return isFuel(resolveRodType(stack.getItem(), level)); + } + + /** + * Level-aware variant of {@link #IS_COOLED}: resolves the rod type through + * the world registries first, so datapack-defined rod types are honoured. + */ + public static boolean isCooled(ItemStack stack, Level level) { + if (!IS_NOT_NULL.test(stack) || stack.isEmpty()) return false; + if (stack.is(CNItemTags.COOLER.tag)) return true; + return isCooled(resolveRodType(stack.getItem(), level)); + } + public static String tooltipKey(ItemStack stack) { if (!IS_NOT_NULL.test(stack)) return "unknown"; if (IS_FUEL.test(stack)) return "fuel"; if (IS_COOLED.test(stack)) return "cooled"; return "unknown"; } + + public static String tooltipKey(ItemStack stack, Level level) { + if (!IS_NOT_NULL.test(stack)) return "unknown"; + if (isFuel(stack, level)) return "fuel"; + if (isCooled(stack, level)) return "cooled"; + return "unknown"; + } } @Override public String toString() { return "RodType [items: " + this.items() + - ", baseRodHeat: " + this.baseRodHeat() + - ", proximityRodHeat: " + this.proximityRodHeat() + - ", rodTimer: " + this.rodTimer() + - ", type: " + this.type() + - ", useConfig: " + this.useConfig() + "]"; + ", baseRodHeat: " + this.baseRodHeat().get() + + ", proximityRodHeat: " + this.proximityRodHeat().get() + + ", rodTimer: " + this.rodTimer().get() + + ", ratio: " + this.ratio().get() + + ", type: " + this.type() + "]"; } } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/IHeat.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/IHeat.java index bf56b3f..fe17625 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/IHeat.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/IHeat.java @@ -1,15 +1,19 @@ package net.nuclearteam.createnuclear.content.multiblock; import com.simibubi.create.content.equipment.wrench.IWrenchable; +import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.lang.Lang; import net.createmod.catnip.lang.LangBuilder; import net.minecraft.ChatFormatting; import net.minecraft.world.item.ItemStack; -import net.nuclearteam.createnuclear.CNTags.CNItemTags; +import net.minecraft.world.level.Level; import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRodPredicate; import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; +import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; +import net.nuclearteam.createnuclear.infrastructure.config.CReactorHeat; public interface IHeat extends IWrenchable { enum HeatLevel { @@ -53,21 +57,38 @@ public int getHeatValue() { }; } - public static HeatLevel of(int heat) { + public static HeatLevel of(int heat, int reactorSize) { if (heat < 0) return NONE; heat = Math.abs(heat); - if (heat > 0 && heat < 500) return SAFETY; - if (heat >= 501 && heat <= 800) return CAUTION; - if (heat >= 801 && heat <= 1000) return WARNING; - if (heat >= 1001) return DANGER; + CReactorHeat config = CNConfigs.server().reactorHeat; + int danger; + + switch (reactorSize) { + case 5 -> danger = config.size5Danger.get(); + case 7 -> danger = config.size7Danger.get(); + case 9 -> danger = config.size9Danger.get(); + default -> danger = config.size5Danger.get(); + } + + int caution = (int) (danger * 0.75); + int warning = (int) (danger * 0.90); + + if (heat > 0 && heat < caution) return SAFETY; + if (heat >= caution && heat < warning) return CAUTION; + if (heat >= warning && heat <= danger) return WARNING; + if (heat > danger) return DANGER; return NONE; } - public static LangBuilder getFormattedHeatText(int heat) { - HeatLevel heatLevel = of(heat); + public static boolean isNotDanger(int heat, int reactorSize) { + return of(heat, reactorSize) != DANGER; + } + + public static LangBuilder getFormattedHeatText(int heat, int reactorSize) { + HeatLevel heatLevel = of(heat, reactorSize); LangBuilder builder = CreateLang.builder(CreateNuclear.MOD_ID).text(TooltipHelper.makeProgressBar(5, heatLevel.ordinal()+1)); builder.translate("tooltip.heatLevel." + Lang.asId(heatLevel.name())) @@ -85,28 +106,24 @@ public static LangBuilder getFormattedHeatText(int heat) { return builder; } - public static LangBuilder getFormattedItemText(ItemStack itemRod, Boolean IsEmpty) { + public static LangBuilder getFormattedItemText(ItemStack itemRod, Boolean isEmpty, Level level) { LangBuilder builder = Lang.builder(CreateNuclear.MOD_ID); - String tooltip = "unknown"; - - if (itemRod.is(CNItemTags.FUEL.tag)) { - tooltip = "uranium"; - } - - if (itemRod.is(CNItemTags.COOLER.tag)) { - tooltip = "graphene"; - } + String tooltip = TypeRodPredicate.tooltipKey(itemRod, level); builder.translate("tooltip.item." + tooltip + ".rod") - // when it's empty, we show the number minus one to display zero because we fake the item count as 1 - .add(CreateNuclearLang.number(Math.abs((IsEmpty ? itemRod.getCount() - 1 : itemRod.getCount())))) - .style(ChatFormatting.BLUE) + // when it's empty, we show the number minus one to display zero because we fake the item count as 1 + .add(CreateNuclearLang.number(Math.abs((isEmpty ? itemRod.getCount() - 1 : itemRod.getCount())))) + .style(ChatFormatting.BLUE) ; return builder; } + public static LangBuilder getFormattedItemText(BigItemStack itemRod, Boolean isEmpty, Level level) { + return getFormattedItemText(new ItemStack(itemRod.stack.getItem(), itemRod.count), isEmpty, level); + } + public static LangBuilder getName(String name) { LangBuilder builder = CreateNuclearLang.builder(CreateNuclear.MOD_ID); builder.translate("gui." + name + ".info_header.title"); @@ -114,4 +131,4 @@ public static LangBuilder getName(String name) { return builder; } } -} +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlock.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlock.java index 0569b00..8fb5bb6 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlock.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlock.java @@ -36,6 +36,12 @@ @SuppressWarnings("deprecation") public class ReactorControllerBlock extends HorizontalDirectionalReactorBlock implements IWrenchable, IBE { public static final BooleanProperty ASSEMBLED = BooleanProperty.create("assembled"); + /** + * Whether the reactor is currently producing energy. Recomputed server-side on + * every tick by the controller block entity and synced to the client by vanilla, + * which is what drives the running-sound loop and the lit controller texture. + */ + public static final BooleanProperty ACTIVE = BooleanProperty.create("active"); public ReactorControllerBlock(Properties properties) { super(properties); @@ -43,7 +49,7 @@ public ReactorControllerBlock(Properties properties) { @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(FACING).add(ASSEMBLED); + builder.add(FACING).add(ASSEMBLED).add(ACTIVE); super.createBlockStateDefinition(builder); } @@ -51,7 +57,8 @@ protected void createBlockStateDefinition(StateDefinition.Builder tooltip, boolean isPlayerSneak CreateLang.translate("gui.gauge.info_header").style(ChatFormatting.GRAY).forGoggles(tooltip); IHeat.HeatLevel.getName("reactor_controller").style(ChatFormatting.GRAY).forGoggles(tooltip); - IHeat.HeatLevel.getFormattedHeatText(heat).forGoggles(tooltip); + IHeat.HeatLevel.getFormattedHeatText(heat, getMultiblockSize()).forGoggles(tooltip); if (fuelItem.isEmpty()) { // if rod empty we initialize it at 1 (and display it as 0) to avoid having air item displayed instead of the rod - IHeat.HeatLevel.getFormattedItemText(new ItemStack(CNItems.URANIUM_ROD.asItem(), 1), true).forGoggles(tooltip); + IHeat.HeatLevel.getFormattedItemText(new ItemStack(CNItems.URANIUM_ROD.asItem(), 1), true, level).forGoggles(tooltip); } else { - IHeat.HeatLevel.getFormattedItemText(fuelItem, false).forGoggles(tooltip); + IHeat.HeatLevel.getFormattedItemText(fuelItem, false, level).forGoggles(tooltip); } if (fuelItem.isEmpty()) { // if rod empty we initialize it at 1 (and display it as 0) to avoid having air item displayed instead of the rod - IHeat.HeatLevel.getFormattedItemText(new ItemStack(CNItems.GRAPHITE_ROD.asItem(), 1), true).forGoggles(tooltip); + IHeat.HeatLevel.getFormattedItemText(new ItemStack(CNItems.GRAPHITE_ROD.asItem(), 1), true, level).forGoggles(tooltip); } else { - IHeat.HeatLevel.getFormattedItemText(coolerItem, false).forGoggles(tooltip); + IHeat.HeatLevel.getFormattedItemText(coolerItem, false, level).forGoggles(tooltip); } } @@ -463,7 +463,8 @@ public void tick() { heat = (int) calculateHeat(inventory.getItem(0)); if (updateTimers()) { - if (IHeat.HeatLevel.of(heat) == IHeat.HeatLevel.SAFETY || IHeat.HeatLevel.of(heat) == IHeat.HeatLevel.CAUTION || IHeat.HeatLevel.of(heat) == IHeat.HeatLevel.WARNING) { + IHeat.HeatLevel currentLevel = IHeat.HeatLevel.of(heat, getMultiblockSize()); + if (currentLevel == IHeat.HeatLevel.SAFETY || currentLevel == IHeat.HeatLevel.CAUTION || currentLevel == IHeat.HeatLevel.WARNING) { this.rotate(getBlockState(), new BlockPos(getBlockPos().getX(), getBlockPos().getY() + FindController('O').getY(), getBlockPos().getZ()), getLevel(), heat/4, true); return; } else { diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerGenerator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerGenerator.java index 48ac214..618ff0d 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerGenerator.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerGenerator.java @@ -8,6 +8,7 @@ import net.neoforged.neoforge.client.model.generators.ModelFile; public class ReactorControllerGenerator extends SpecialBlockStateGen { + @Override protected int getXRotation(BlockState state) { return 0; @@ -15,11 +16,52 @@ protected int getXRotation(BlockState state) { @Override protected int getYRotation(BlockState state) { + if (state == null || !state.hasProperty(ReactorControllerBlock.FACING)) { + return 0; + } return horizontalAngle(state.getValue(ReactorControllerBlock.FACING)); } @Override public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { - return prov.models().getExistingFile(prov.modLoc("block/reactor/controller/block")); + final String controllerPath = "block/reactor/controller/controller_panel_"; + + // Safety fallback if the state is invalid at the start of Minecraft's block scan + if (!state.hasProperty(ReactorControllerBlock.ASSEMBLED) || !state.hasProperty(ReactorControllerBlock.ACTIVE)) { + return prov.models() + .withExistingParent("block/reactor/controller/" + ControllerVisualState.OFF.getSuffix(), prov.modLoc("block/reactor/controller/block")) + .texture("1", prov.modLoc(controllerPath + ControllerVisualState.OFF.getSuffix())) + .texture("particle", prov.modLoc(controllerPath + ControllerVisualState.OFF.getSuffix())); + } + + boolean isAssembled = state.getValue(ReactorControllerBlock.ASSEMBLED); + boolean isActive = state.getValue(ReactorControllerBlock.ACTIVE); + + ControllerVisualState controllerState = ControllerVisualState.OFF; + if (isAssembled) { + controllerState = isActive ? ControllerVisualState.ON : ControllerVisualState.STANDBY; + } + + return prov.models() + .withExistingParent("block/reactor/controller/" + controllerState.getSuffix(), prov.modLoc("block/reactor/controller/block")) + .texture("1", prov.modLoc(controllerPath + controllerState.getSuffix())) + .texture("particle", prov.modLoc(controllerPath + controllerState.getSuffix())); + } + + enum ControllerVisualState { + OFF("off"), + ON("on"), + STANDBY("standby") + ; + + private final String suffix; + + ControllerVisualState(String suffix) { + this.suffix = suffix; + } + + public String getSuffix() { + return this.suffix; + } } -} \ No newline at end of file +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/core/ReactorCoreEntity.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/core/ReactorCoreEntity.java index 1eb1704..acbaddb 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/core/ReactorCoreEntity.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/core/ReactorCoreEntity.java @@ -30,7 +30,7 @@ public void tick() { BlockPos controllerPos = getBlockPosForReactor(); if (level.getBlockEntity(controllerPos) instanceof ReactorControllerBlockEntity reactorController) { int heat = reactorController.heat; - if (IHeat.HeatLevel.of(heat) == IHeat.HeatLevel.DANGER) { + if (IHeat.HeatLevel.of(heat, reactorController.getMultiblockSize()) == IHeat.HeatLevel.DANGER) { if (countdownTicks >= CNConfigs.common().explode.time.get()) { // 300 ticks = 15 secondes explodeReactorCore(level, getBlockPos()); } else { diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCServer.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCServer.java index 5ae7b0b..d8e4a77 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCServer.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCServer.java @@ -6,6 +6,7 @@ public class CNCServer extends ConfigBase { public final CRods rods = nested(0, CRods::new, Comments.rods); public final CNotify notify = nested(0, CNotify::new, Comments.notify); public final CRadiation radiation = nested(0, CRadiation::new, Comments.radiation); + public final CReactorHeat reactorHeat = nested(0, CReactorHeat::new, Comments.reactorHeat); public final CBiomeRestore biomeRestore = nested(0, CBiomeRestore::new, Comments.biomeRestore); @Override @@ -18,6 +19,7 @@ private static class Comments { static String explode = "[WIP] Modify explosion parameters."; static String radiation = "Enable or disable radiation effects emitted by mod items."; static String notify = "Notification settings for reactor warnings."; + static String reactorHeat = "Heat thresholds for different reactor sizes"; static String biomeRestore = "Control how irradiated biomes are restored back to their original biome."; } } diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CReactorHeat.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CReactorHeat.java new file mode 100644 index 0000000..6d10f36 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CReactorHeat.java @@ -0,0 +1,14 @@ +package net.nuclearteam.createnuclear.infrastructure.config; + +import net.createmod.catnip.config.ConfigBase; + +public class CReactorHeat extends ConfigBase { + public final ConfigInt size5Danger = i(256, 0, 8192, "size5Danger", "Heat threshold for DANGER level (5x5 reactor)"); + public final ConfigInt size7Danger = i(1024, 0, 8192, "size7Danger", "Heat threshold for DANGER level (7x7 reactor)"); + public final ConfigInt size9Danger = i(4096, 0, 8192, "size9Danger", "Heat threshold for DANGER level (9x9 reactor)"); + + @Override + public String getName() { + return "ReactorHeat"; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRods.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRods.java index 947b9f4..9d70893 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRods.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRods.java @@ -1,10 +1,26 @@ package net.nuclearteam.createnuclear.infrastructure.config; import net.createmod.catnip.config.ConfigBase; +import net.minecraft.MethodsReturnNonnullByDefault; +@MethodsReturnNonnullByDefault public class CRods extends ConfigBase { public final ConfigInt uraniumRodLifetime = i(3600, 100, 5000, "Uranium rod lifespan", Comments.UraniumRodLifetime, Comments.hintTick); + public final ConfigInt uraniumProximityBonus = i(32, -70, 70, "uranium_proximity_bonus", Comments.warning, Comments.uraniumProximityBonus); + public final ConfigInt uraniumBaseValue = i(64, -70, 70, "uranium_base_value", Comments.warning, Comments.uraniumBaseValue); + public final ConfigInt uraniumHeatRatio = i(2, -10, 10, "Heat ratio for uranium rods", Comments.warning, Comments.uraniumHeatRatio); + public final ConfigInt graphiteRodLifetime = i(3600, 100, 5000, "Graphite rod lifespan", Comments.GraphiteRodLifetime, Comments.hintTick); + // the proximity value of coolant items are divisions so if the heat of the fuel is 64, the calcul will be "heat + 64/-4" + public final ConfigFloat graphiteProximityMalus = f(-0.25f, -70, 70, "graphite_proximity_penalty", Comments.warning, Comments.graphiteProximityMalus); + public final ConfigInt graphiteBaseValue = i(-32, -50, 50, "graphite_base_value", Comments.warning, Comments.graphiteBaseValue); + public final ConfigInt graphiteHeatRatio = i(1, -10, 10, "Heat ratio for graphite rods", Comments.warning, Comments.graphiteHeatRatio); + + public final ConfigInt thoriumRodLifetime = i(3600, 100, 5000, "Thorium rod lifetime (in ticks)", Comments.thoriumRodLifetime, Comments.hintTick); + public final ConfigInt thoriumProxyBonus = i(8, -70, 70, "Heat bonus from nearby thorium rods", Comments.warning, Comments.thoriumProximityBonus); + public final ConfigInt baseValueThorium = i(16, -70, 70, "Base heat value for thorium rods", Comments.warning, Comments.thoriumBaseValue); + public final ConfigInt thoriumHeatRatio = i(1, -10, 10, "Heat ratio for thorium rods", Comments.warning, Comments.thoriumHeatRatio); + public final ConfigInt maxHeat = i(1000, 200, 1000, "Maximum reactor heat", Comments.maxHeat, Comments.hintHeat); @Override @@ -14,8 +30,23 @@ public String getName() { private static class Comments { static String hintTick = "20 ticks = 1 second"; + static String warning = "Changing these values may unbalance reactor behavior."; + static String UraniumRodLifetime = "Uranium rod lifespan in reactor"; + static String uraniumProximityBonus = "Heat bonus applied when uranium rods are adjacent."; + static String uraniumBaseValue = "Base heat contribution of a uranium rod before modifiers."; + static String uraniumHeatRatio = "Heat ratio modifier for a uranium rod"; + static String GraphiteRodLifetime = "Graphite rod lifespan in reactor"; + static String graphiteProximityMalus = "Heat penalty applied when graphite rods are adjacent."; + static String graphiteBaseValue = "Base heat contribution of a graphite rod before modifiers."; + static String graphiteHeatRatio = "Heat ratio modifier for a graphite rod"; + + static String thoriumRodLifetime = "Lifetime of thorium rods in the reactor"; + static String thoriumProximityBonus = "Bonus heat applied when thorium rods are adjacent"; + static String thoriumBaseValue = "Base heat contribution of a thorium rod before modifiers"; + static String thoriumHeatRatio = "Heat ratio modifier for a thorium rod"; + static String maxHeat = "Maximum heat a reactor block can handle"; static String hintHeat = "Avoids reactor failure due to excessive heat"; } From ce17de9a8e5f246b9e269c70f408196fe6770868 Mon Sep 17 00:00:00 2001 From: mathi Date: Thu, 6 Aug 2026 15:14:56 +0200 Subject: [PATCH 02/33] feat(reactor): port lot 1 - thermal model (reactorLogic) Ports the reactor's thermal model from the Forge branch. Six of the seven files are byte-identical to their Forge counterpart; DefaultHeatCalculator only differs by the ItemStackHandler import. - DefaultHeatCalculator: per-slot heat from the blueprint pattern, with the adjacency bonus/malus resolved through a precomputed neighbour map. Only rods actually present in the inputs contribute, so a pattern asking for more rods than are loaded no longer over-reports heat. - DefaultOverheatController: overheat escalates while the reactor is out of balance, and the escalation accelerates as overFlowLimiter shrinks. Two independent malus sources: fuel/cooler ratio above the 6:1 equilibrium, and coolant missing or past its maxHeat. - HeatBalance / EquilibriumState: the 6:1 wiki equilibrium, weighted by the RodType ratio introduced in lot 0. - HeatManager: facade resolving the coolant type before delegating. ReactorDisplayState comes along from lot 4: it is a hard dependency of computeHeat(). Its NBT methods take a HolderLookup.Provider because BigFluidStack.write()/read() require one on NeoForge, and item lookup goes through BuiltInRegistries.ITEM.getOptional() so an item removed with its mod is dropped instead of silently resolving to air. Nothing calls HeatManager yet - wiring lands with lot 3 (services) and lot 6 (block entity), which is also when DefaultHeatCalculatorGameTest gets ported to actually exercise this. Co-Authored-By: Claude Opus 5 (1M context) --- PORTAGE_REACTEUR.md | 24 ++- .../display/ReactorDisplayState.java | 141 ++++++++++++++++++ .../reactorLogic/DefaultHeatCalculator.java | 111 ++++++++++++++ .../DefaultOverheatController.java | 45 ++++++ .../reactorLogic/EquilibriumState.java | 21 +++ .../multiblock/reactorLogic/HeatBalance.java | 34 +++++ .../multiblock/reactorLogic/HeatManager.java | 33 ++++ .../reactorLogic/IHeatCalculator.java | 11 ++ .../reactorLogic/IOverheatController.java | 10 ++ 9 files changed, 426 insertions(+), 4 deletions(-) create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/display/ReactorDisplayState.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/DefaultHeatCalculator.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/DefaultOverheatController.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/EquilibriumState.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/HeatBalance.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/HeatManager.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/IHeatCalculator.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/IOverheatController.java diff --git a/PORTAGE_REACTEUR.md b/PORTAGE_REACTEUR.md index 4dba924..a0ae055 100644 --- a/PORTAGE_REACTEUR.md +++ b/PORTAGE_REACTEUR.md @@ -100,20 +100,36 @@ Forge déclare `ASSEMBLED` **et** `ACTIVE`. NeoForge n'a que `ASSEMBLED`. ## 4. Fichiers à créer — par ordre de portage -### Lot 0 — Prérequis (rien ne compile sans) +### Lot 0 — Prérequis (rien ne compile sans) ✅ FAIT | Fichier | Note | |---|---| | `infrastructure/config/CReactorHeat.java` | création | | `infrastructure/config/CRods.java` | **extension** (thorium + ratios + proximité) | -| `api/multiblock/rods/RodType.java` | **modification** (`ratio()`, prédicats `RodType`) | +| `api/multiblock/rods/RodType.java` | **modification** (valeurs en `Supplier`, `ratio()`, prédicats `RodType`) | | `content/multiblock/IHeat.java` | **modification** (seuils par taille) | | `content/multiblock/controller/ReactorControllerBlock.java` | **modification** (`ACTIVE`) | - -### Lot 1 — Modèle thermique (`reactorLogic/`, 7 fichiers, ~217 lignes) +| `content/multiblock/controller/ReactorControllerGenerator.java` | **modification** (textures off/standby/on) | +| `CNItems.java` | **modification** — voir ci-dessous | + +> **Trouvé en cours de route :** seul `THORIUM_ROD` avait un `RodType` enregistré côté +> NeoForge. `URANIUM_ROD` et `GRAPHITE_ROD` n'en avaient aucun, donc `resolveRodType()` +> retombait sur `FALLBACK` (type `NONE`), que `DefaultHeatCalculator` ignore : le modèle +> thermique aurait calculé **zéro chaleur en permanence**, sans erreur visible. Les trois +> barres sont désormais enregistrées et adossées à la config. +> +> ⚠️ Le blockstate du contrôleur passe de 8 à 16 variants (ajout d'`ACTIVE`) : +> `runData` doit être relancé, sinon le bloc affiche un modèle manquant en jeu. + +### Lot 1 — Modèle thermique (`reactorLogic/`, 7 fichiers, ~217 lignes) ✅ FAIT `IHeatCalculator` · `DefaultHeatCalculator` · `IOverheatController` · `DefaultOverheatController` · `HeatBalance` · `EquilibriumState` · `HeatManager` Cœur du modèle : équilibre 6:1 fuel/cooler, surchauffe qui s'accélère (`overFlowLimiter` décrémenté), pénalité de fluide insuffisant ou de dépassement du `maxHeat` du fluide. +> **Correction d'ordre :** `display/ReactorDisplayState` est une dépendance dure de +> `DefaultHeatCalculator` (paramètre de `computeHeat`). Il a donc été porté avec le lot 1 +> au lieu du lot 4. Ses méthodes NBT prennent un `HolderLookup.Provider` en 1.21, parce que +> `BigFluidStack.write()/read()` l'exigent côté NeoForge. + ### Lot 2 — Lecture de pattern & consommation (`consumable/`, 6 fichiers, ~317 lignes) `PatternReader` · `IConsumable` · `ItemConsumable` · `FluidConsumable` · `ConsumableTimer` · `ConsumptionCycleManager` diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/display/ReactorDisplayState.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/display/ReactorDisplayState.java new file mode 100644 index 0000000..ae81082 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/display/ReactorDisplayState.java @@ -0,0 +1,141 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.display; + +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +/** + * Immutable snapshot of the data the reactor controller exposes for client-side + * display (e.g. the Goggles tooltip rendered by {@code ReactorGoggleTooltipRenderer}). + *

+ * Instances are produced server-side once per tick from the live input inventories + * and tanks, then synced to the client through the block entity's {@code clientPacket} + * NBT via {@link #serializeNBT(HolderLookup.Provider)} / + * {@link #deserializeNBT(HolderLookup.Provider, CompoundTag)}. This data is transient + * sync data only: it is not part of the persisted save NBT, so its layout can evolve + * freely without migration concerns. + *

+ * Usage: + *

{@code
+ * // Server side, e.g. in tick():
+ * this.displayState = new ReactorDisplayState(items, fluids, maxFluidCapacity);
+ *
+ * // Writing the client packet:
+ * compound.put("displayState", displayState.serializeNBT(registries));
+ *
+ * // Reading the client packet:
+ * displayState = compound.contains("displayState")
+ *         ? ReactorDisplayState.deserializeNBT(registries, compound.getCompound("displayState"))
+ *         : ReactorDisplayState.EMPTY;
+ * }
+ * + * @param items item rods currently loaded, mapped to their stacked count + * @param fluids fluids currently loaded in the input tanks + * @param maxFluidCapacity combined capacity (in millibuckets) of all input fluid tanks + */ +public record ReactorDisplayState(Map items, List fluids, long maxFluidCapacity) { + static final String COMPONENT_ITEM = "Item"; + static final String COMPONENT_COUNT = "Count"; + static final String COMPONENT_CLIENT_DISPLAY_ITEMS = "clientDisplayItems"; + static final String COMPONENT_CLIENT_DISPLAY_FLUIDS = "clientDisplayFluids"; + static final String COMPONENT_CLIENT_MAX_FLUIDS_CAPACITY = "clientMaxFluidCapacity"; + + /** + * Shared empty instance, used before the first tick has populated any display + * data and as the fallback when the client packet doesn't carry a display state. + */ + public static final ReactorDisplayState EMPTY = new ReactorDisplayState(Map.of(), List.of(), 0); + + /** + * Defensively copies the given collections so the record stays immutable + * regardless of how the caller's collections are mutated afterwards. + */ + public ReactorDisplayState { + items = Map.copyOf(items); + fluids = List.copyOf(fluids); + } + + /** + * Serializes this state into NBT for inclusion in the block entity's + * {@code clientPacket} data. Pair with + * {@link #deserializeNBT(HolderLookup.Provider, CompoundTag)} to restore an + * equivalent instance on the client. + * + * @param registries registry lookup used to write the contained fluid stacks + * @return a new {@link CompoundTag} containing the serialized item map, + * fluid list and max fluid capacity + */ + public CompoundTag serializeNBT(HolderLookup.Provider registries) { + CompoundTag compound = new CompoundTag(); + + ListTag displayItemsTag = new ListTag(); + for (Entry entry : items().entrySet()) { + CompoundTag tag = new CompoundTag(); + tag.putString(COMPONENT_ITEM, BuiltInRegistries.ITEM.getKey(entry.getKey()).toString()); + tag.putInt(COMPONENT_COUNT, entry.getValue()); + displayItemsTag.add(tag); + } + compound.put(COMPONENT_CLIENT_DISPLAY_ITEMS, displayItemsTag); + + ListTag displayFluidsTag = new ListTag(); + for (BigFluidStack stack : fluids()) { + displayFluidsTag.add(stack.write(registries)); + } + compound.put(COMPONENT_CLIENT_DISPLAY_FLUIDS, displayFluidsTag); + + compound.putLong(COMPONENT_CLIENT_MAX_FLUIDS_CAPACITY, maxFluidCapacity()); + + return compound; + } + + /** + * Reconstructs a {@link ReactorDisplayState} from NBT previously produced by + * {@link #serializeNBT(HolderLookup.Provider)}. Acts as a static factory since + * records cannot be mutated in place. + *

+ * Missing keys are treated as empty/zero, so a compound that contains none of + * the expected entries yields an instance equivalent to {@link #EMPTY}. + * + * @param registries registry lookup used to read the contained fluid stacks + * @param compound the {@code displayState} compound from the client packet + * @return a new immutable {@link ReactorDisplayState} built from the given NBT + */ + public static ReactorDisplayState deserializeNBT(HolderLookup.Provider registries, CompoundTag compound) { + Map items = new HashMap<>(); + if (compound.contains(COMPONENT_CLIENT_DISPLAY_ITEMS)) { + ListTag list = compound.getList(COMPONENT_CLIENT_DISPLAY_ITEMS, Tag.TAG_COMPOUND); + for (int i = 0; i < list.size(); i++) { + CompoundTag tag = list.getCompound(i); + ResourceLocation id = ResourceLocation.tryParse(tag.getString(COMPONENT_ITEM)); + if (id == null) continue; + Item item = BuiltInRegistries.ITEM.getOptional(id).orElse(null); + if (item != null) { + items.put(item, tag.getInt(COMPONENT_COUNT)); + } + } + } + + List fluids = new ArrayList<>(); + if (compound.contains(COMPONENT_CLIENT_DISPLAY_FLUIDS)) { + ListTag list = compound.getList(COMPONENT_CLIENT_DISPLAY_FLUIDS, Tag.TAG_COMPOUND); + for (int i = 0; i < list.size(); i++) { + fluids.add(BigFluidStack.read(registries, list.getCompound(i))); + } + } + + long maxFluidCapacity = compound.getLong(COMPONENT_CLIENT_MAX_FLUIDS_CAPACITY); + + return new ReactorDisplayState(items, fluids, maxFluidCapacity); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/DefaultHeatCalculator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/DefaultHeatCalculator.java new file mode 100644 index 0000000..c51c075 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/DefaultHeatCalculator.java @@ -0,0 +1,111 @@ +package net.nuclearteam.createnuclear.content.multiblock.reactorLogic; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; +import net.neoforged.neoforge.items.ItemStackHandler; +import net.nuclearteam.createnuclear.api.multiblock.fluid.ReactorFluidType; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRod; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRodPredicate; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintItem; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerInventory; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorDisplayState; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class DefaultHeatCalculator implements IHeatCalculator { + private static final int[][] FORMATTED_PATTERN = new int[][]{ + {99,99,99,0,1,2,99,99,99}, + {99,99,3,4,5,6,7,99,99}, + {99,8,9,10,11,12,13,14,99}, + {15,16,17,18,19,20,21,22,23}, + {24,25,26,27,28,29,30,31,32}, + {33,34,35,36,37,38,39,40,41}, + {99,42,43,44,45,46,47,48,99}, + {99,99,49,50,51,52,53,99,99}, + {99,99,99,54,55,56,99,99,99} + }; + private static final int[][] OFFSETS = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} }; + + private static final Map> NEIGHBORS_BY_SLOT = buildNeighborsBySlot(); + + private static Map> buildNeighborsBySlot() { + Map> result = new HashMap<>(); + for (int row = 0; row < FORMATTED_PATTERN.length; row++) { + for (int col = 0; col < FORMATTED_PATTERN[row].length; col++) { + int slot = FORMATTED_PATTERN[row][col]; + if (slot == 99) continue; + + List neighbors = new ArrayList<>(); + for (int[] offset : OFFSETS) { + int nj = row + offset[0]; + int nk = col + offset[1]; + + if (nj < 0 || nj >= FORMATTED_PATTERN.length || nk < 0 || nk >= FORMATTED_PATTERN[nj].length) continue; + + int neighborSlot = FORMATTED_PATTERN[nj][nk]; + if (neighborSlot != 99) neighbors.add(neighborSlot); + } + + result.put(slot, neighbors); + } + } + + return result; + } + + @Override + public double computeHeat(BigFluidStack bigFluidStack, ReactorFluidType type, ReactorControllerInventory inventory, double overHeat, ReactorDisplayState displayState, Level level) { + double heat = 0; + + ItemStackHandler pattern = ReactorBluePrintItem.getItemStorage(inventory.getStackInSlot(0)); + + Map availableItems = displayState != null && displayState.items() != null + ? new HashMap<>(displayState.items()) + : new HashMap<>(); + + Map actualRods = new HashMap<>(); + + for (int slot = 0; slot < pattern.getSlots(); slot++) { + ItemStack currentStack = pattern.getStackInSlot(slot); + if (currentStack.isEmpty()) continue; + + Item rodItem = currentStack.getItem(); + if (availableItems.getOrDefault(rodItem, 0) > 0) { + availableItems.put(rodItem, availableItems.get(rodItem) - 1); + actualRods.put(slot, currentStack); + } + } + + for (Map.Entry entry : actualRods.entrySet()) { + int slot = entry.getKey(); + ItemStack currentStack = entry.getValue(); + RodType rod = RodType.resolveRodType(currentStack.getItem(), level); + + if (!rod.isNotEmptyItem() || rod.type() == TypeRod.NONE) continue; + + heat += rod.baseRodHeat().get(); + + // find position in formattedPattern and check neighbors + for (int neighborSlot : NEIGHBORS_BY_SLOT.getOrDefault(slot, List.of())) { + ItemStack neighborStack = actualRods.get(neighborSlot); + if (neighborStack == null) continue; + + RodType neighborRod = RodType.resolveRodType(neighborStack.getItem(), level); + if (!neighborRod.isNotEmptyItem()) continue; + + if (TypeRodPredicate.isFuel(rod) && TypeRodPredicate.isFuel(neighborRod)) { + heat += rod.proximityRodHeat().get(); + } else if (TypeRodPredicate.isCooled(rod) && TypeRodPredicate.isFuel(neighborRod)) { + heat += neighborRod.baseRodHeat().get() * rod.proximityRodHeat().get(); + } + } + } + return Math.max(0, heat + overHeat); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/DefaultOverheatController.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/DefaultOverheatController.java new file mode 100644 index 0000000..54ab6e6 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/DefaultOverheatController.java @@ -0,0 +1,45 @@ +package net.nuclearteam.createnuclear.content.multiblock.reactorLogic; + +import net.nuclearteam.createnuclear.api.multiblock.fluid.ReactorFluidType; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; + +class DefaultOverheatController implements IOverheatController { + private int overFlowHeatTimer = 0; + private int overFlowLimiter = 30; + private double overHeat = 0; + + private final int liquidTimer = 3600; + + @Override + public void updateState(HeatBalance heatBalance, int currentHeat, BigFluidStack bigFluidStack, ReactorFluidType type) { + int fluidAmount = bigFluidStack == null ? 0 : bigFluidStack.amount; + int fluidEfficiency = type == null ? -1 : type.efficiency(); + boolean exceedsFluidMaxHeat = type != null && Math.abs(currentHeat) > type.maxHeat(); + + boolean rodMalus = heatBalance.resolve() == EquilibriumState.OVERHEATING; + boolean fluidMalus = fluidEfficiency == -1 || fluidAmount < fluidEfficiency || exceedsFluidMaxHeat; + + int malusPoints = (rodMalus ? 1 : 0) + (fluidMalus ? 1 : 0); + + if (malusPoints > 0) { + overFlowHeatTimer++; + if (overFlowHeatTimer >= overFlowLimiter) { + overHeat += malusPoints; + overFlowHeatTimer = 0; + overFlowLimiter = Math.max(2, overFlowLimiter - malusPoints); + } + } else { + overFlowHeatTimer = 0; + overFlowLimiter = 30; + if (overHeat > 0) overHeat -= 2; + else overHeat = 0; + } + } + + @Override + public double getOverHeat() { return overHeat; } + + + @Override + public int getLiquidTimer() { return liquidTimer; } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/EquilibriumState.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/EquilibriumState.java new file mode 100644 index 0000000..3dbe6ea --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/EquilibriumState.java @@ -0,0 +1,21 @@ +package net.nuclearteam.createnuclear.content.multiblock.reactorLogic; + +/** + * Reactor thermal equilibrium state, derived from the fuel:cooler ratio + * (wiki reference: {@code heatPoints / coolingPoints} ratio compared to 6). + *

+ * Only {@link #OVERHEATING} is currently consumed by + * {@link DefaultOverheatController} (triggers the escalation toward + * shutdown/explosion). {@link #BALANCED} and {@link #OVERCOOLING} are kept + * for future versions (wiki-style status display, output bonus/malus) but + * have no effect on overheating today: a reactor in overcooling is simply + * suboptimal (less heat produced), not penalized. + */ +public enum EquilibriumState { + /** ratio > 6:1 — too much fuel for the cooling, leads to explosion. */ + OVERHEATING, + /** ratio == 6:1 — exact wiki equilibrium. */ + BALANCED, + /** ratio < 6:1 — safe but suboptimal output, no malus. */ + OVERCOOLING +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/HeatBalance.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/HeatBalance.java new file mode 100644 index 0000000..ea6b3f9 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/HeatBalance.java @@ -0,0 +1,34 @@ +package net.nuclearteam.createnuclear.content.multiblock.reactorLogic; + +/** + * Thermal balance of a pattern: heat points (fuel) and cooling points + * (cooler), each weighted by {@link net.nuclearteam.createnuclear.api.multiblock.rods.RodType#ratio()}. + *

+ * Since {@code graphiteHeatRatio} switched to a positive value (1), + * {@code heatPoints} and {@code coolingPoints} are both raw positive sums + * (e.g. uranium=2/rod, thorium=1/rod, graphite=1/rod) — the 6:1 equilibrium + * ratio (wiki reference) is therefore no longer implicit in the config and + * must be compared explicitly via {@link #TARGET_RATIO}. + */ +public record HeatBalance(int heatPoints, int coolingPoints) { + /** Reference fuel:cooler ratio (wiki) at equilibrium. */ + public static final int TARGET_RATIO = 6; + + /** + * Resolves the equilibrium state from this balance. + * + * @return {@link EquilibriumState#OVERHEATING} if no cooler is present + * while there is fuel, otherwise the state corresponding to the + * comparison of {@code heatPoints / coolingPoints} against + * {@link #TARGET_RATIO} + */ + public EquilibriumState resolve() { + if (coolingPoints == 0) return heatPoints() > 0 ? EquilibriumState.OVERHEATING : EquilibriumState.BALANCED; + + double ration = (double) heatPoints() / coolingPoints(); + if (ration > TARGET_RATIO) return EquilibriumState.OVERHEATING; + if (ration < TARGET_RATIO) return EquilibriumState.OVERCOOLING; + + return EquilibriumState.BALANCED; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/HeatManager.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/HeatManager.java new file mode 100644 index 0000000..e546466 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/HeatManager.java @@ -0,0 +1,33 @@ +package net.nuclearteam.createnuclear.content.multiblock.reactorLogic; + +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.api.multiblock.fluid.ReactorFluidType; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerInventory; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorDisplayState; + +/** + * HeatManager facade delegating to extracted components (in separate files). + */ +public class HeatManager { + private final IHeatCalculator calculator; + private final IOverheatController overheatController; + + public HeatManager(IHeatCalculator calculator, IOverheatController overheatController) { + this.calculator = calculator; + this.overheatController = overheatController; + } + + public HeatManager() { + this(new DefaultHeatCalculator(), new DefaultOverheatController()); + } + + public double calculateHeat(BigFluidStack bigFluidStack, HeatBalance heatBalance, int previousHeat, ReactorControllerInventory inventory, Level level, ReactorDisplayState displayState) { + ReactorFluidType type = bigFluidStack == null ? null : bigFluidStack.getFluidtype(level); + overheatController.updateState(heatBalance, previousHeat, bigFluidStack, type); + + return calculator.computeHeat(bigFluidStack, type, inventory, overheatController.getOverHeat(), displayState, level); + } + + public int getLiquidTimer() { return overheatController.getLiquidTimer();} +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/IHeatCalculator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/IHeatCalculator.java new file mode 100644 index 0000000..09dbba9 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/IHeatCalculator.java @@ -0,0 +1,11 @@ +package net.nuclearteam.createnuclear.content.multiblock.reactorLogic; + +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.api.multiblock.fluid.ReactorFluidType; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerInventory; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorDisplayState; + +public interface IHeatCalculator { + double computeHeat(BigFluidStack bigFluidStack, ReactorFluidType type, ReactorControllerInventory inventory, double overHeat, ReactorDisplayState displayState, Level level); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/IOverheatController.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/IOverheatController.java new file mode 100644 index 0000000..62090d5 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/IOverheatController.java @@ -0,0 +1,10 @@ +package net.nuclearteam.createnuclear.content.multiblock.reactorLogic; + +import net.nuclearteam.createnuclear.api.multiblock.fluid.ReactorFluidType; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; + +public interface IOverheatController { + void updateState(HeatBalance heatBalance, int currentHeat, BigFluidStack bigFluidStack, ReactorFluidType type); + double getOverHeat(); + int getLiquidTimer(); +} From 6b4067730b3672b73657d299ea9e315a3bdf5df1 Mon Sep 17 00:00:00 2001 From: mathi Date: Thu, 6 Aug 2026 15:29:06 +0200 Subject: [PATCH 03/33] feat(reactor): port lot 2 - pattern reading and rod consumption Ports the consumable cycle from the Forge branch. Four of the five carried files are byte-identical; ConsumptionCycleManager only differs by the registry lookup and the empty-pattern check. - ConsumptionCycleManager: one timer per rod type present in the pattern, persisted in NBT so a cycle survives a reload. Timers are rebuilt when the pattern changes rather than restarted from scratch, so editing a blueprint does not refund the elapsed lifetime. - ItemConsumable / FluidConsumable / ConsumableTimer / IConsumable: unchanged from Forge. PatternReader is rewritten rather than translated. Forge parsed the raw patternAll/pattern NBT elements off the blueprint stack; on NeoForge the blueprint carries a typed ReactorBluePrintData component, so it now reads patternAll() directly, falling back to pattern(). Fixes a divergence in ReactorBluePrintMenu that this exposed: on Forge, pattern is the player's raw grid and patternAll is the normalized view where empty slots AND non-rod items become glass panes. On NeoForge both fields pointed at the same array and kept non-rod items. Any stray item left in the grid would then be counted by PatternReader as a pattern requirement, and since updateHeatOnly() requires every requirement to be present in the inputs, heat would have stayed pinned at 0 with nothing to show for it. saveData now builds the two arrays separately. getItemStorage() keeps reading pattern() (raw), matching the Forge version which reads the raw pattern NBT element. Also drops the duplicated ReactorBluePrintData construction in saveData: both instances were built from identical inputs, so the follow-up equals() check could never fire. Co-Authored-By: Claude Opus 5 (1M context) --- PORTAGE_REACTEUR.md | 15 +- .../bluePrintItem/ReactorBluePrintMenu.java | 28 +-- .../consumable/ConsumableTimer.java | 62 +++++++ .../consumable/ConsumptionCycleManager.java | 162 ++++++++++++++++++ .../consumable/FluidConsumable.java | 49 ++++++ .../controller/consumable/IConsumable.java | 24 +++ .../controller/consumable/ItemConsumable.java | 45 +++++ .../controller/consumable/PatternReader.java | 57 ++++++ 8 files changed, 427 insertions(+), 15 deletions(-) create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ConsumableTimer.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ConsumptionCycleManager.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/FluidConsumable.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/IConsumable.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ItemConsumable.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/PatternReader.java diff --git a/PORTAGE_REACTEUR.md b/PORTAGE_REACTEUR.md index a0ae055..0d76203 100644 --- a/PORTAGE_REACTEUR.md +++ b/PORTAGE_REACTEUR.md @@ -130,11 +130,24 @@ Cœur du modèle : équilibre 6:1 fuel/cooler, surchauffe qui s'accélère (`ove > au lieu du lot 4. Ses méthodes NBT prennent un `HolderLookup.Provider` en 1.21, parce que > `BigFluidStack.write()/read()` l'exigent côté NeoForge. -### Lot 2 — Lecture de pattern & consommation (`consumable/`, 6 fichiers, ~317 lignes) +### Lot 2 — Lecture de pattern & consommation (`consumable/`, 6 fichiers, ~317 lignes) ✅ FAIT `PatternReader` · `IConsumable` · `ItemConsumable` · `FluidConsumable` · `ConsumableTimer` · `ConsumptionCycleManager` `PatternReader` est utilisé par le lot 1 et le lot 3 — à porter tôt. +> **Divergence corrigée dans `ReactorBluePrintMenu` :** côté Forge, `pattern` est la grille +> brute du joueur et `patternAll` la **même grille normalisée** — slots vides *et* items +> non-barres remplacés par du `GLASS_PANE`. Côté NeoForge les deux champs pointaient sur +> **le même tableau**, et les items non-barres y étaient conservés. +> +> Sans correction, un item quelconque déposé dans la grille aurait été compté par +> `PatternReader` comme une exigence du pattern. `ReactorHeatUpdateCoordinator.updateHeatOnly` +> exige que *chaque* entrée du pattern soit disponible dans les inputs : un item non-barre +> n'étant jamais fourni, la chaleur serait restée bloquée à 0 sans erreur visible. +> +> `saveData` construit désormais deux tableaux distincts. `getItemStorage()` continue de lire +> `pattern()` (brut), comme la version Forge qui lit l'élément NBT `pattern`. + ### Lot 3 — Services (`service/`, 14 fichiers, ~536 lignes) `IHeatService` / `DefaultHeatService` · `IPersistenceService` / `DefaultPersistenceService` · `IExplosionService` / `ReactorMeltdownExecutor` · `IReactorMeltdownMonitor` / `ReactorMeltdownMonitor` · `IReactorAlarmCoordinator` / `ReactorAlarmCoordinator` · `IReactorHeatUpdateCoordinator` / `ReactorHeatUpdateCoordinator` · `IFluidConsumptionRateCalculator` / `FluidConsumptionRateCalculator` diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintMenu.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintMenu.java index 810981a..e823ecd 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintMenu.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintMenu.java @@ -14,6 +14,8 @@ import net.neoforged.neoforge.items.SlotItemHandler; import net.nuclearteam.createnuclear.*; import net.nuclearteam.createnuclear.CNTags.CNItemTags; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRod; import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; import static net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintItem.getItemStorage; @@ -137,7 +139,12 @@ protected void saveData(ItemStack contentHolder) { {3, 8}, {4, 8}, {5, 8} }; + // `pattern` keeps the grid exactly as the player laid it out; `patternAll` is the + // normalized view where every empty slot AND every non-rod item becomes a glass + // pane, so consumers can assume it only ever holds real rods (see PatternReader). PatternData[] patternData = new PatternData[positions.length]; + PatternData[] patternAllData = new PatternData[positions.length]; + ItemStack glassPane = new ItemStack(Items.GLASS_PANE); int countGraphiteRod = 0; int countUraniumRod = 0; @@ -152,26 +159,19 @@ protected void saveData(ItemStack contentHolder) { countUraniumRod++; } patternData[i] = new PatternData(i, stack); + + RodType rodType = RodType.resolveRodType(stack.getItem(), playerInventory.player.level()); + boolean isRod = rodType.type() == TypeRod.FUEL || rodType.type() == TypeRod.COOLER; + patternAllData[i] = new PatternData(i, isRod ? stack : glassPane); } else { - patternData[i] = new PatternData(i, new ItemStack(Items.GLASS_PANE)); + patternData[i] = new PatternData(i, glassPane); + patternAllData[i] = new PatternData(i, glassPane); } } - /*CreateNuclear.LOGGER.warn("PatternData slots:\n{}\n\n Count: {}", - Arrays.stream(patternData) - .map(pd -> "Slot " + pd.slot() + " => " + pd.stack()) - .collect(Collectors.joining("\n")), countGraphiteRod - );*/ - - ReactorBluePrintData reactorBluePrintData = new ReactorBluePrintData(countGraphiteRod, countUraniumRod, CNConfigs.common().rods.graphiteRodLifetime.get(), CNConfigs.common().rods.uraniumRodLifetime.get(), patternData, patternData); + ReactorBluePrintData reactorBluePrintData = new ReactorBluePrintData(countGraphiteRod, countUraniumRod, CNConfigs.common().rods.graphiteRodLifetime.get(), CNConfigs.common().rods.uraniumRodLifetime.get(), patternData, patternAllData); contentHolder.set(CNDataComponents.REACTOR_BLUE_PRINT_DATA, reactorBluePrintData); - ReactorBluePrintData newData = new ReactorBluePrintData(countGraphiteRod, countUraniumRod, CNConfigs.common().rods.graphiteRodLifetime.get(), CNConfigs.common().rods.uraniumRodLifetime.get(), patternData, patternData); - - if (!newData.equals(reactorBluePrintData)) { - contentHolder.set(CNDataComponents.REACTOR_BLUE_PRINT_DATA, newData); - } - } protected int getPlayerInventoryXOffset() { diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ConsumableTimer.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ConsumableTimer.java new file mode 100644 index 0000000..f668341 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ConsumableTimer.java @@ -0,0 +1,62 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.consumable; + +import net.minecraft.nbt.CompoundTag; + +public class ConsumableTimer { + private final IConsumable consumable; + private int remainingTicks; + private int maxTicks; + private int countInPattern; + + public ConsumableTimer(IConsumable consumable, int maxTicks, int count) { + this.consumable = consumable; + this.maxTicks = maxTicks; + this.remainingTicks = maxTicks; + this.countInPattern = count; + } + + public boolean tick() { + if (remainingTicks > 0) + remainingTicks--; + return remainingTicks <= 0; + } + + public void reset(int newMaxTicks, int newCount) { + this.maxTicks = newMaxTicks; + this.remainingTicks = newMaxTicks; + this.countInPattern = newCount; + } + + public IConsumable getConsumable() { + return consumable; + } + + public String getId() { + return consumable.getId(); + } + + public int getCountInPattern() { + return countInPattern; + } + + public int getMaxTicks() { + return maxTicks; + } + + public CompoundTag serializeNBT() { + CompoundTag tag = new CompoundTag(); + tag.put("consumable", consumable.serializeNBT()); + tag.putInt("remainingTicks", remainingTicks); + tag.putInt("maxTicks", maxTicks); + tag.putInt("countInPattern", countInPattern); + return tag; + } + + public static ConsumableTimer deserializeNBT(CompoundTag tag) { + IConsumable consumable = IConsumable.deserializeNBT(tag.getCompound("consumable")); + ConsumableTimer t = new ConsumableTimer( + consumable, tag.getInt("maxTicks"), tag.getInt("countInPattern")); + t.remainingTicks = tag.getInt("remainingTicks"); + return t; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ConsumptionCycleManager.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ConsumptionCycleManager.java new file mode 100644 index 0000000..ae44bc9 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ConsumptionCycleManager.java @@ -0,0 +1,162 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.consumable; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.CNDataComponents; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputManagerI; + +import java.util.*; + +public class ConsumptionCycleManager { + + private final List timers = new ArrayList<>(); + private Map patternSnapshot = new HashMap<>(); + + public void startCycle(ItemStack pattern, Level level) { + timers.clear(); + buildTimers(pattern, level); + takeSnapshot(pattern, level); + } + + public void resetCycle(ItemStack pattern, Level level, ReactorInputManagerI manager) { + Map counts = PatternReader.readItemCounts(pattern); + List updated = new ArrayList<>(); + + for (Map.Entry entry : counts.entrySet()) { + RodType rodType = RodType.resolveRodType(entry.getKey(), level); + if (!rodType.isNotEmptyItem()) + continue; + + String id = BuiltInRegistries.ITEM.getKey(entry.getKey()).getPath(); + int count = entry.getValue(); + int ticks = new ItemConsumable(id, rodType).computeTimer(count); + + timers.stream() + .filter(t -> t.getId().equals(id)) + .findFirst() + .ifPresentOrElse( + existing -> { + existing.reset(ticks, count); + updated.add(existing); + }, + () -> updated.add(new ConsumableTimer( + new ItemConsumable(id, rodType), ticks, count))); + } + + timers.clear(); + timers.addAll(updated); + takeSnapshot(pattern, level); + } + + public boolean tick(ReactorInputManagerI manager, Level level) { + boolean consumed = false; + Iterator it = timers.iterator(); + + while (it.hasNext()) { + ConsumableTimer timer = it.next(); + if (timer.tick()) { + timer.getConsumable().consume(manager, level); + consumed = true; + + if (timer.getCountInPattern() > 1) { + timer.reset(timer.getMaxTicks(), timer.getCountInPattern()); + } else { + it.remove(); + } + } + } + return consumed; + } + + public boolean hasPatternChanged(ItemStack pattern, Level level) { + Map current = readItemIds(pattern, level); + if (current.size() != patternSnapshot.size()) + return true; + for (Map.Entry e : current.entrySet()) + if (!e.getValue().equals(patternSnapshot.get(e.getKey()))) + return true; + return false; + } + + public boolean isEmpty() { + return timers.isEmpty(); + } + + public void clear() { + timers.clear(); + patternSnapshot.clear(); + } + + public CompoundTag serializeNBT() { + ListTag list = new ListTag(); + timers.forEach(t -> list.add(t.serializeNBT())); + CompoundTag tag = new CompoundTag(); + tag.put("timers", list); + CompoundTag snap = new CompoundTag(); + patternSnapshot.forEach(snap::putInt); + tag.put("snapshot", snap); + return tag; + } + + public void deserializeNBT(CompoundTag tag) { + timers.clear(); + tag.getList("timers", Tag.TAG_COMPOUND) + .forEach(t -> timers.add(ConsumableTimer.deserializeNBT((CompoundTag) t))); + CompoundTag snap = tag.getCompound("snapshot"); + snap.getAllKeys().forEach(k -> patternSnapshot.put(k, snap.getInt(k))); + } + + private void buildTimers(ItemStack pattern, Level level) { + PatternReader.readItemCounts(pattern).forEach((item, count) -> { + RodType rodType = RodType.resolveRodType(item, level); + if (!rodType.isNotEmptyItem()) + return; + String id = BuiltInRegistries.ITEM.getKey(item).getPath(); + int ticks = new ItemConsumable(id, rodType).computeTimer(count); + timers.add(new ConsumableTimer(new ItemConsumable(id, rodType), ticks, count)); + }); + } + + private void takeSnapshot(ItemStack pattern, Level level) { + patternSnapshot = readItemIds(pattern, level); + } + + private Map readItemIds(ItemStack pattern, Level level) { + Map result = new HashMap<>(); + PatternReader.readItemCounts(pattern).forEach((item, count) -> { + RodType rt = RodType.resolveRodType(item, level); + if (rt.isNotEmptyItem()) + result.put(BuiltInRegistries.ITEM.getKey(item).getPath(), count); + }); + return result; + } + + /** + * Advances the consumption cycle by one tick: starts a cycle if none is + * running and the pattern isn't empty, resets it if the pattern changed + * (only checked when {@code checkPatternChange} is true), then ticks the + * current cycle. + * + * @param checkPatternChange if {@code false}, the pattern change isn't + * checked this tick (used to throttle the check's frequency) + */ + public void update(ItemStack pattern, Level level, ReactorInputManagerI inputManager, boolean checkPatternChange) { + boolean emptyPattern = pattern.isEmpty() || pattern.get(CNDataComponents.REACTOR_BLUE_PRINT_DATA) == null; + if (isEmpty() && !emptyPattern) { + startCycle(pattern, level); + } + + if (!isEmpty()) { + if (checkPatternChange && hasPatternChanged(pattern, level)) { + resetCycle(pattern, level, inputManager); + } + tick(inputManager, level); + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/FluidConsumable.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/FluidConsumable.java new file mode 100644 index 0000000..be34dc9 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/FluidConsumable.java @@ -0,0 +1,49 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.consumable; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputManagerI; + +public class FluidConsumable implements IConsumable { + private final String fluidName; + private final int mbPerCycle; + private final int baseTicks; + + public FluidConsumable(String fluidName, int mbPerCycle, int baseTicks) { + this.fluidName = fluidName; + this.mbPerCycle = mbPerCycle; + this.baseTicks = baseTicks; + } + + @Override + public String getId() { + return fluidName; + } + + @Override + public int computeTimer(int count) { + return Math.max(1, baseTicks); + } + + @Override + public boolean consume(ReactorInputManagerI manager, Level level) { + return false; + } + + @Override + public CompoundTag serializeNBT() { + CompoundTag tag = new CompoundTag(); + tag.putString("type", "fluid"); + tag.putString("fluidName", fluidName); + tag.putInt("mbPerCycle", mbPerCycle); + tag.putInt("baseTicks", baseTicks); + return tag; + } + + public static FluidConsumable deserializeNBT(CompoundTag tag) { + return new FluidConsumable( + tag.getString("fluidName"), + tag.getInt("mbPerCycle"), + tag.getInt("baseTicks")); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/IConsumable.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/IConsumable.java new file mode 100644 index 0000000..21d0ee5 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/IConsumable.java @@ -0,0 +1,24 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.consumable; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputManagerI; + +public interface IConsumable { + String getId(); + + int computeTimer(int countInPattern); + + boolean consume(ReactorInputManagerI manager, Level level); + + CompoundTag serializeNBT(); + + static IConsumable deserializeNBT(CompoundTag tag) { + return switch (tag.getString("type")) { + case "item" -> ItemConsumable.deserializeNBT(tag); + case "fluid" -> FluidConsumable.deserializeNBT(tag); + default -> throw new IllegalArgumentException( + "Unknown consumable type: " + tag.getString("type")); + }; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ItemConsumable.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ItemConsumable.java new file mode 100644 index 0000000..556b554 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ItemConsumable.java @@ -0,0 +1,45 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.consumable; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputManagerI; + +public class ItemConsumable implements IConsumable { + private final String itemName; + private final RodType rodType; + + public ItemConsumable(String itemName, RodType rodType) { + this.itemName = itemName; + this.rodType = rodType; + } + + @Override + public String getId() { + return itemName; + } + + @Override + public int computeTimer(int count) { + int base = Math.max(1, rodType.rodTimer().get()); + return Math.max(1, (int) (base / Math.max(1, count))); + } + + @Override + public boolean consume(ReactorInputManagerI manager, Level level) { + return manager.extractItemByName(level, itemName); + } + + @Override + public CompoundTag serializeNBT() { + CompoundTag tag = new CompoundTag(); + tag.putString("type", "item"); + tag.putString("itemName", itemName); + return tag; + } + + public static ItemConsumable deserializeNBT(CompoundTag tag) { + String itemName = tag.getString("itemName"); + return new ItemConsumable(itemName, null); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/PatternReader.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/PatternReader.java new file mode 100644 index 0000000..41c49c7 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/PatternReader.java @@ -0,0 +1,57 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.consumable; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.nuclearteam.createnuclear.CNDataComponents; +import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.PatternData; +import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintData; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * Reads the rods a configured blueprint asks for, as a count per item. + *

+ * The Forge implementation parsed the raw {@code patternAll}/{@code pattern} NBT + * elements off the blueprint stack. On NeoForge the blueprint carries a typed + * {@link ReactorBluePrintData} data component instead, so the parsing is replaced + * by a direct read of {@link ReactorBluePrintData#patternAll()}. + *

+ * {@code patternAll} is the normalized view written by + * {@code ReactorBluePrintMenu#saveData}: empty slots and non-rod items are stored + * as glass panes, which is why glass panes are the only value skipped here. + * {@link ReactorBluePrintData#pattern()} (the raw grid) is used as a fallback for + * blueprints written before the two views diverged. + */ +public final class PatternReader { + + private PatternReader() { + } + + public static Map readItemCounts(ItemStack configuredPattern) { + if (configuredPattern == null || configuredPattern.isEmpty()) + return Collections.emptyMap(); + + ReactorBluePrintData data = configuredPattern.get(CNDataComponents.REACTOR_BLUE_PRINT_DATA); + if (data == null) + return Collections.emptyMap(); + + PatternData[] slots = data.patternAll(); + if (slots == null || slots.length == 0) + slots = data.pattern(); + if (slots == null || slots.length == 0) + return Collections.emptyMap(); + + Map counts = new HashMap<>(); + for (PatternData slot : slots) { + if (slot == null) + continue; + ItemStack stack = slot.stack(); + if (stack != null && !stack.isEmpty() && !stack.is(Items.GLASS_PANE)) + counts.merge(stack.getItem(), 1, Integer::sum); + } + return counts; + } +} From 521d6cfadb56a03ff870b07d0649f179450e8ae0 Mon Sep 17 00:00:00 2001 From: mathi Date: Thu, 6 Aug 2026 15:42:44 +0200 Subject: [PATCH 04/33] feat(reactor): port lot 3 - reactor services (12 of 14) Ports the reactor's service layer from the Forge branch. Nine of the ten straight ports are byte-identical; DefaultHeatService differs by one trailing space. - ReactorMeltdownMonitor: 300-tick danger countdown driving the stabilized / overheating / meltdown-flash / critical-failure notifications. - ReactorMeltdownExecutor: spawns the explosion sized from reactor footprint and fuel count (sqrt for diminishing returns), then irradiates the biome. - ReactorAlarmCoordinator: drives the alarm blocks off the danger flag and awards SILENCE_THE_CORE on the rising edge. - ReactorHeatUpdateCoordinator: fuel-only gate for canRun() vs full-pattern gate for updateHeatOnly(). - FluidConsumptionRateCalculator: coolant drain rate per reactor size. Neutralizes the copyTag() trap documented in PORTAGE_REACTEUR.md section 5.1. The Forge code stored heat by mutating configuredPattern.getOrCreateTag() in place. On NeoForge reading that tag back yields a defensive copy, so a literal translation would compile, throw nothing, and leave heat pinned at zero forever. Writing now goes through CNDataComponents.HEAT, which already existed as a DataComponentType, isolated in writeHeat(). The empty-pattern check moves to isEmptyPattern(), testing for the absence of ReactorBluePrintData. Those are the only non-javadoc differences from Forge. IPersistenceService and DefaultPersistenceService are deferred to lot 6: they call block entity accessors that do not exist yet on the NeoForge controller (Direction vs String facing, BoundingBox vs int[] bounds, inventory serialization, display state). Porting them now would mean rewriting the block entity, which is lot 6 itself. Co-Authored-By: Claude Opus 5 (1M context) --- PORTAGE_REACTEUR.md | 19 ++- .../service/DefaultHeatService.java | 26 +++ .../FluidConsumptionRateCalculator.java | 52 ++++++ .../controller/service/IExplosionService.java | 17 ++ .../IFluidConsumptionRateCalculator.java | 25 +++ .../controller/service/IHeatService.java | 13 ++ .../service/IReactorAlarmCoordinator.java | 29 ++++ .../IReactorHeatUpdateCoordinator.java | 87 ++++++++++ .../service/IReactorMeltdownMonitor.java | 31 ++++ .../service/ReactorAlarmCoordinator.java | 44 +++++ .../service/ReactorHeatUpdateCoordinator.java | 154 ++++++++++++++++++ .../service/ReactorMeltdownExecutor.java | 51 ++++++ .../service/ReactorMeltdownMonitor.java | 67 ++++++++ 13 files changed, 613 insertions(+), 2 deletions(-) create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/DefaultHeatService.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/FluidConsumptionRateCalculator.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IExplosionService.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IFluidConsumptionRateCalculator.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IHeatService.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorAlarmCoordinator.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorHeatUpdateCoordinator.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorMeltdownMonitor.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorAlarmCoordinator.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorHeatUpdateCoordinator.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorMeltdownExecutor.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorMeltdownMonitor.java diff --git a/PORTAGE_REACTEUR.md b/PORTAGE_REACTEUR.md index 0d76203..8b22e08 100644 --- a/PORTAGE_REACTEUR.md +++ b/PORTAGE_REACTEUR.md @@ -148,8 +148,23 @@ Cœur du modèle : équilibre 6:1 fuel/cooler, surchauffe qui s'accélère (`ove > `saveData` construit désormais deux tableaux distincts. `getItemStorage()` continue de lire > `pattern()` (brut), comme la version Forge qui lit l'élément NBT `pattern`. -### Lot 3 — Services (`service/`, 14 fichiers, ~536 lignes) -`IHeatService` / `DefaultHeatService` · `IPersistenceService` / `DefaultPersistenceService` · `IExplosionService` / `ReactorMeltdownExecutor` · `IReactorMeltdownMonitor` / `ReactorMeltdownMonitor` · `IReactorAlarmCoordinator` / `ReactorAlarmCoordinator` · `IReactorHeatUpdateCoordinator` / `ReactorHeatUpdateCoordinator` · `IFluidConsumptionRateCalculator` / `FluidConsumptionRateCalculator` +### Lot 3 — Services (`service/`, 12 fichiers sur 14) ✅ FAIT +`IHeatService` / `DefaultHeatService` · `IExplosionService` / `ReactorMeltdownExecutor` · `IReactorMeltdownMonitor` / `ReactorMeltdownMonitor` · `IReactorAlarmCoordinator` / `ReactorAlarmCoordinator` · `IReactorHeatUpdateCoordinator` / `ReactorHeatUpdateCoordinator` · `IFluidConsumptionRateCalculator` / `FluidConsumptionRateCalculator` + +> **Le piège de §5.1 est neutralisé.** `CNDataComponents.HEAT` (`DataComponentType`) +> **existait déjà** côté NeoForge — inutile d'en créer un. `ReactorHeatUpdateCoordinator` +> écrit désormais via `configuredPattern.set(CNDataComponents.HEAT, (float) heat)`, dans une +> méthode `writeHeat()` dédiée, au lieu de muter `getOrCreateTag()`. Le test de pattern vide +> passe par `isEmptyPattern()`, qui vérifie l'absence de `ReactorBluePrintData`. +> +> Hors javadoc, ce sont les **seules** différences avec l'original Forge : 9 des 10 autres +> fichiers sont identiques à l'octet. + +> **Reporté au lot 6 :** `IPersistenceService` et `DefaultPersistenceService`. Ils appellent +> des accesseurs que le `ReactorControllerBlockEntity` NeoForge actuel n'a pas encore +> (`setMultiblockFacing(Direction)` vs `String`, `getMultiblockPos()` en `BoundingBox` vs +> `int[]`, `serializeInventory`, `get/setDisplayState`). Les porter maintenant obligerait à +> réécrire le BE, c'est-à-dire à faire le lot 6 — ils partiront donc avec lui. ### Lot 4 — Affichage & snapshot (6 fichiers, ~450 lignes) `snapshot/ReactorInputSnapshot` · `snapshot/ReactorInputSnapshotBuilder` · `display/ReactorDisplayState` · `display/ReactorGoggleTooltipRenderer` · `manager/ReactorFrameDisplayManagerI` · `manager/ReactorFrameDisplayManager` diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/DefaultHeatService.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/DefaultHeatService.java new file mode 100644 index 0000000..d066346 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/DefaultHeatService.java @@ -0,0 +1,26 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerInventory; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorDisplayState; +import net.nuclearteam.createnuclear.content.multiblock.reactorLogic.HeatBalance; +import net.nuclearteam.createnuclear.content.multiblock.reactorLogic.HeatManager; + +public class DefaultHeatService implements IHeatService { + private final HeatManager impl; + + public DefaultHeatService(HeatManager impl) { + this.impl = impl; + } + + @Override + public int getLiquidTimer() { + return impl.getLiquidTimer(); + } + + @Override + public double calculateHeat(BigFluidStack bigFluidStack, HeatBalance heatBalance, int previousHeat, ReactorControllerInventory inventory, Level level, ReactorDisplayState displayState) { + return impl.calculateHeat(bigFluidStack, heatBalance, previousHeat, inventory, level, displayState); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/FluidConsumptionRateCalculator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/FluidConsumptionRateCalculator.java new file mode 100644 index 0000000..57c48cf --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/FluidConsumptionRateCalculator.java @@ -0,0 +1,52 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputFluidManagerI; + +/** + * Default implementation of {@link IFluidConsumptionRateCalculator}. + * The rate per cycle depends on the fluid's efficiency and the liquid timer + * exposed by {@link IHeatService}, which itself depends on the reactor size. + */ +public class FluidConsumptionRateCalculator implements IFluidConsumptionRateCalculator { + private final IHeatService heatService; + + public FluidConsumptionRateCalculator(IHeatService heatService) { + this.heatService = heatService; + } + + /** + * {@inheritDoc} + * Does nothing if the fluid stack is {@code null} or holds a negligible + * amount (≤ 1). + */ + @Override + public double tick(BigFluidStack fluidStack, int reactorSize, Level level, + ReactorInputFluidManagerI inputFluidManager, double fluidBuffer) { + if (fluidStack == null || fluidStack.amount <= 1) { + return fluidBuffer; + } + + double amountPerCycle = fluidStack.getFluidtype(level).efficiency(); + switch (reactorSize) { + case 5 -> amountPerCycle /= (double) heatService.getLiquidTimer() / 40; + case 7 -> amountPerCycle /= (double) heatService.getLiquidTimer() / 147; + case 9 -> amountPerCycle /= (double) heatService.getLiquidTimer() / 360; + } + + fluidBuffer += amountPerCycle; + + if (fluidBuffer >= 1.0) { + int toExtract = (int) Math.floor(fluidBuffer); + // Known limitation in ReactorInputFluidManager#extractFluids: fluidNeeded is not + // decremented across multiple tracked input handlers, so each handler may drain up + // to toExtract independently (possible over-extraction with several inputs). + // Intentionally left untouched here; out of scope for this calculator. + if (inputFluidManager.extractFluids(level, toExtract)) { + fluidBuffer -= toExtract; + } + } + return fluidBuffer; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IExplosionService.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IExplosionService.java new file mode 100644 index 0000000..13fa188 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IExplosionService.java @@ -0,0 +1,17 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; + +public interface IExplosionService { + void triggerExplosion(ServerLevel level, BlockPos controllerPos, int reactorSize, int countFuelRod, + int notifyRadius, boolean notifyWarnAll); + + default void triggerExplosion(ServerLevel level, BlockPos controllerPos, int reactorSize, int countFuelRod) { + triggerExplosion(level, controllerPos, reactorSize, + countFuelRod, CNConfigs.server().notify.warningDistance.get(), + CNConfigs.server().notify.warnAllPlayers.get() + ); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IFluidConsumptionRateCalculator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IFluidConsumptionRateCalculator.java new file mode 100644 index 0000000..9a9830f --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IFluidConsumptionRateCalculator.java @@ -0,0 +1,25 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputFluidManagerI; + +/** + * Computes how much fluid should be consumed per tick and triggers extraction + * once the accumulated amount reaches a whole unit. + */ +public interface IFluidConsumptionRateCalculator { + + /** + * Advances the consumption calculation by one tick. + * + * @param fluidStack fluid currently loaded, or {@code null} if none + * @param reactorSize reactor size, used to determine the consumption rate + * @param level current level, used to resolve the fluid type + * @param inputFluidManager input manager responsible for extracting the consumed fluid + * @param fluidBuffer fractional remainder accumulated since the previous tick + * @return the new fractional remainder to carry over to the next tick + */ + double tick(BigFluidStack fluidStack, int reactorSize, Level level, + ReactorInputFluidManagerI inputFluidManager, double fluidBuffer); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IHeatService.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IHeatService.java new file mode 100644 index 0000000..ed396bd --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IHeatService.java @@ -0,0 +1,13 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerInventory; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorDisplayState; +import net.nuclearteam.createnuclear.content.multiblock.reactorLogic.HeatBalance; + +public interface IHeatService { + int getLiquidTimer(); + + double calculateHeat(BigFluidStack bigFluidStack, HeatBalance heatBalance, int previousHeat, ReactorControllerInventory inventory, Level level, ReactorDisplayState displayState); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorAlarmCoordinator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorAlarmCoordinator.java new file mode 100644 index 0000000..f83fe12 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorAlarmCoordinator.java @@ -0,0 +1,29 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorAlarmManagerI; + +/** + * Classifies the reactor's heat into a danger flag and drives the + * {@link net.nuclearteam.createnuclear.content.multiblock.alarm.ReactorAlarm} blocks + * registered in a {@link ReactorAlarmManagerI} accordingly. + */ +public interface IReactorAlarmCoordinator { + + /** + * @param heat the heat value to classify + * @param multiblockSize the reactor's multiblock size, used to resolve the danger threshold + * @return {@code true} if {@code heat} falls in the DANGER heat-level range + */ + boolean computeDanger(int heat, int multiblockSize); + + /** + * Powers on/off every alarm block known to {@code alarmManager} to match {@code isDanger}, + * and awards the SILENCE_THE_CORE advancement on the rising edge (alarm turning on). + * + * @param level the reactor's level + * @param alarmManager the manager holding the alarm block positions + * @param isDanger whether the alarms should be powered on + */ + void update(Level level, ReactorAlarmManagerI alarmManager, boolean isDanger); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorHeatUpdateCoordinator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorHeatUpdateCoordinator.java new file mode 100644 index 0000000..789dd78 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorHeatUpdateCoordinator.java @@ -0,0 +1,87 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerInventory; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorDisplayState; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputFluidManagerI; +import net.nuclearteam.createnuclear.content.multiblock.reactorLogic.HeatBalance; + +/** + * Centralizes the reactor's heat calculation logic and the decision of + * whether it has enough fuel to run. + *

+ * The {@link HeatBalance} consumed by {@link #updateHeatOnly} and + * {@link #calculateAndWriteHeat} is produced upstream by + * {@link #calculateHeatBalance}; callers resolve it once per tick and pass + * the result into both methods below. + *

+ * Both write methods store the resulting heat on the blueprint stack through + * the {@code CNDataComponents.HEAT} data component. The Forge implementation + * mutated the stack's NBT tag in place; that has no NeoForge equivalent, + * because reading the tag back yields a defensive copy. + */ +public interface IReactorHeatUpdateCoordinator { + + /** + * Computes the pattern's fuel/cooler heat balance (see {@link HeatBalance}), + * used to determine whether the reactor is within the wiki-reference 6:1 + * fuel:cooler equilibrium. + * + * @param configuredPattern the blueprint's configured pattern (required items) + * @param displayState snapshot of items/fluids currently available to the reactor, may be {@code null} + * @param level the level the reactor is in, used to resolve rod types + * @return the resolved heat balance for the pattern + */ + HeatBalance calculateHeatBalance(ItemStack configuredPattern, ReactorDisplayState displayState, Level level); + + /** + * Determines whether the reactor has enough fuel (FUEL-type rods) to start, + * on top of being assembled and having a fluid input. + * + * @param configuredPattern the blueprint's configured pattern (required items) + * @param displayState snapshot of items/fluids currently available to the reactor, may be {@code null} + * @param inputFluidManager the reactor's fluid input manager, used to check that at least one input exists + * @param level the level the reactor is in, used to resolve rod types + * @param assembled whether the multiblock is currently assembled + * @return {@code true} if every fuel rod required by the pattern is + * available and at least one fuel rod is required + */ + boolean canRun(ItemStack configuredPattern, ReactorDisplayState displayState, + ReactorInputFluidManagerI inputFluidManager, Level level, boolean assembled); + + /** + * Updates the heat without running the reactor (case where it isn't ready). + * Heat is only calculated if the full pattern (every required item, not + * just fuel) is available; otherwise it drops back to zero. + * + * @param configuredPattern the blueprint's configured pattern (required items) + * @param displayState snapshot of items/fluids currently available to the reactor, may be {@code null} + * @param fluidStack the reactor's current coolant fluid stack, may be {@code null} + * @param heatBalance the pattern's fuel/cooler heat balance for this tick + * @param previousHeat the heat value calculated on the previous tick + * @param inventory the reactor controller's inventory, used to read the configured pattern items + * @param level the level the reactor is in + * @param assembled whether the multiblock is currently assembled + * @return the calculated heat, also written to the configured pattern's heat component + */ + int updateHeatOnly(ItemStack configuredPattern, ReactorDisplayState displayState, BigFluidStack fluidStack, + HeatBalance heatBalance, int previousHeat, ReactorControllerInventory inventory, Level level, boolean assembled); + + /** + * Calculates the reactor's heat during normal operation and writes it to + * the configured pattern's heat component. + * + * @param configuredPattern the blueprint's configured pattern (required items) + * @param fluidStack the reactor's current coolant fluid stack, may be {@code null} + * @param heatBalance the pattern's fuel/cooler heat balance for this tick + * @param previousHeat the heat value calculated on the previous tick + * @param inventory the reactor controller's inventory, used to read the configured pattern items + * @param level the level the reactor is in + * @param displayState snapshot of items/fluids currently available to the reactor, may be {@code null} + * @return the calculated heat + */ + int calculateAndWriteHeat(ItemStack configuredPattern, BigFluidStack fluidStack, HeatBalance heatBalance, int previousHeat, + ReactorControllerInventory inventory, Level level, ReactorDisplayState displayState); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorMeltdownMonitor.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorMeltdownMonitor.java new file mode 100644 index 0000000..a326391 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorMeltdownMonitor.java @@ -0,0 +1,31 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; + +/** + * Tracks the reactor's meltdown countdown and the player notifications tied to it. + * Consumes the danger flag computed by {@link IReactorAlarmCoordinator#computeDanger} + * instead of recomputing it, so the heat-level classification stays in a single place. + */ +public interface IReactorMeltdownMonitor { + + /** + * Outcome of a single countdown tick. + * {@code NONE} - not in danger, countdown reset to zero. + * {@code CRITICAL} - in danger, countdown running, explosion threshold not reached yet. + * {@code EXPLODE} - countdown threshold reached, the caller must trigger the explosion now. + */ + enum MeltdownState { NONE, CRITICAL, EXPLODE } + + /** + * Advances the countdown by one tick and sends the matching player notifications + * (stabilized / overheating / meltdown flash / critical failure). + * + * @param level the reactor's level, used for notifications and game time + * @param pos the controller's position, used as the notification origin + * @param isDanger whether the reactor is currently at heat level DANGER + * @return the resulting {@link MeltdownState} for this tick + */ + MeltdownState tick (Level level, BlockPos pos, boolean isDanger); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorAlarmCoordinator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorAlarmCoordinator.java new file mode 100644 index 0000000..4b36543 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorAlarmCoordinator.java @@ -0,0 +1,44 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.nuclearteam.createnuclear.content.multiblock.IHeat; +import net.nuclearteam.createnuclear.content.multiblock.alarm.ReactorAlarm; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorAlarmManagerI; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancement; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancementBehaviour; + +/** + * Default {@link IReactorAlarmCoordinator}. Extracted from + * {@code ReactorControllerBlockEntity.activateAlarms(boolean)}: the alarm wiring and + * advancement award are unchanged from the original implementation. + */ +public class ReactorAlarmCoordinator implements IReactorAlarmCoordinator { + private final CNAdvancementBehaviour advancement; + + public ReactorAlarmCoordinator(CNAdvancementBehaviour advancement) { + this.advancement = advancement; + } + + @Override + public boolean computeDanger(int heat, int multiblockSize) { + return IHeat.HeatLevel.of(heat, multiblockSize) == IHeat.HeatLevel.DANGER; + } + + @Override + public void update(Level level, ReactorAlarmManagerI alarmManager, boolean isDanger) { + if (alarmManager == null) return; + + for (BlockPos pos : alarmManager.getBlocksPosition(level)) { + if (!level.isLoaded(pos)) continue; + + BlockState state = level.getBlockState(pos); + + if (state.getBlock() instanceof ReactorAlarm && state.getValue(ReactorAlarm.POWERED) != isDanger) { + level.setBlock(pos, state.setValue(ReactorAlarm.POWERED, isDanger), 3); + if (isDanger) advancement.awardPlayer(CNAdvancement.SILENCE_THE_CORE); + } + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorHeatUpdateCoordinator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorHeatUpdateCoordinator.java new file mode 100644 index 0000000..1ce335e --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorHeatUpdateCoordinator.java @@ -0,0 +1,154 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.CNDataComponents; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintData; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerInventory; +import net.nuclearteam.createnuclear.content.multiblock.controller.consumable.PatternReader; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorDisplayState; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputFluidManagerI; +import net.nuclearteam.createnuclear.content.multiblock.reactorLogic.HeatBalance; + +import java.util.Collections; +import java.util.Map; + +/** + * Default implementation of {@link IReactorHeatUpdateCoordinator}. + * Delegates raw heat calculation to {@link IHeatService} and only adds the + * pattern-availability logic (fuel-only vs. full pattern). + */ +public class ReactorHeatUpdateCoordinator implements IReactorHeatUpdateCoordinator { + private final IHeatService heatService; + + public ReactorHeatUpdateCoordinator(IHeatService heatService) { + this.heatService = heatService; + } + + /** + * A blueprint counts as unconfigured when it carries no + * {@link ReactorBluePrintData}. Replaces the Forge check on an empty NBT tag. + */ + private static boolean isEmptyPattern(ItemStack configuredPattern) { + return configuredPattern.isEmpty() + || configuredPattern.get(CNDataComponents.REACTOR_BLUE_PRINT_DATA) == null; + } + + /** + * Stores the computed heat on the blueprint stack. + *

+ * The Forge original wrote into {@code configuredPattern.getOrCreateTag()}, + * mutating the stack's tag in place. On NeoForge the equivalent read returns a + * defensive copy, so the write has to go through the typed data component or it + * would be silently discarded and the heat would stay pinned at zero. + */ + private static void writeHeat(ItemStack configuredPattern, int heat) { + if (configuredPattern.isEmpty()) return; + configuredPattern.set(CNDataComponents.HEAT, (float) heat); + } + + @Override + public HeatBalance calculateHeatBalance(ItemStack configuredPattern, ReactorDisplayState displayState, Level level) { + Map patternCounts = PatternReader.readItemCounts(configuredPattern); + Map currentItems = displayState != null && displayState.items() != null + ? displayState.items() : Collections.emptyMap(); + + int heatPoints = 0; + int coolingPoints = 0; + + for (Map.Entry entry : patternCounts.entrySet()) { + Item item = entry.getKey(); + int requiredCount = entry.getValue(); + int availableCount = currentItems.getOrDefault(item, 0); + int countToUse = Math.min(requiredCount, availableCount); + if (countToUse <= 0) continue; + + RodType rodType = RodType.resolveRodType(item, level); + if (rodType == null || !rodType.isNotEmptyItem()) continue; + + int weighted = rodType.ratio().get() * countToUse; + if (rodType.type() == RodType.TypeRod.FUEL) heatPoints += weighted; + else if (rodType.type() == RodType.TypeRod.COOLER) coolingPoints += weighted; + } + + return new HeatBalance(heatPoints, coolingPoints); + } + + /** Predicate applied to each pattern entry when checking availability. */ + @FunctionalInterface + private interface PatternEntryCheck { + boolean test(Item item, int requiredCount, int availableCount); + } + + /** + * Iterates over the items required by the configured pattern and applies + * {@code check} to each entry, stopping as soon as one entry fails. + * + * @return {@code true} if {@code check} succeeded for every pattern entry + */ + private static boolean checkPatternAvailability(ItemStack configuredPattern, ReactorDisplayState displayState, + PatternEntryCheck check) { + Map patternCounts = PatternReader.readItemCounts(configuredPattern); + Map currentItems = displayState != null && displayState.items() != null + ? displayState.items() : Collections.emptyMap(); + + for (Map.Entry entry : patternCounts.entrySet()) { + Item item = entry.getKey(); + int requiredCount = entry.getValue(); + int availableCount = currentItems.getOrDefault(item, 0); + if (!check.test(item, requiredCount, availableCount)) { + return false; + } + } + return true; + } + + @Override + public boolean canRun(ItemStack configuredPattern, ReactorDisplayState displayState, + ReactorInputFluidManagerI inputFluidManager, Level level, boolean assembled) { + if (isEmptyPattern(configuredPattern) || inputFluidManager.size() == 0 || !assembled) { + return false; + } + + boolean[] hasAnyFuel = {false}; + boolean allFuelAvailable = checkPatternAvailability(configuredPattern, displayState, + (item, requiredCount, availableCount) -> { + RodType rodType = RodType.resolveRodType(item, level); + if (rodType.isNotEmptyItem() && rodType.type() == RodType.TypeRod.FUEL) { + hasAnyFuel[0] = true; + return availableCount > 0; + } + return true; // non-fuel entries don't block this gate + } + ); + + return allFuelAvailable && hasAnyFuel[0]; + } + + @Override + public int updateHeatOnly(ItemStack configuredPattern, ReactorDisplayState displayState, BigFluidStack fluidStack, + HeatBalance heatBalance, int previousHeat, ReactorControllerInventory inventory, Level level, boolean assembled) { + int heat = 0; + boolean emptyPattern = isEmptyPattern(configuredPattern); + if (!emptyPattern && assembled) { + boolean allAvailable = checkPatternAvailability(configuredPattern, displayState, + (item, requiredCount, availableCount) -> availableCount >= requiredCount); + if (allAvailable) { + heat = (int) heatService.calculateHeat(fluidStack, heatBalance, previousHeat, inventory, level, displayState); + } + } + writeHeat(configuredPattern, heat); + return heat; + } + + @Override + public int calculateAndWriteHeat(ItemStack configuredPattern, BigFluidStack fluidStack, HeatBalance heatBalance, int previousHeat, + ReactorControllerInventory inventory, Level level, ReactorDisplayState displayState) { + int heat = (int) heatService.calculateHeat(fluidStack, heatBalance, previousHeat, inventory, level, displayState); + writeHeat(configuredPattern, heat); + return heat; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorMeltdownExecutor.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorMeltdownExecutor.java new file mode 100644 index 0000000..c957b42 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorMeltdownExecutor.java @@ -0,0 +1,51 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.world.level.GameRules; +import net.nuclearteam.createnuclear.CNEntityType; +import net.nuclearteam.createnuclear.content.explosion.NuclearExplosionEntity; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; +import net.nuclearteam.createnuclear.foundation.utility.NotifyUtil; +import net.nuclearteam.createnuclear.infrastructure.worldgen.biome.BiomeIrradiationService; +import net.nuclearteam.createnuclear.infrastructure.worldgen.biome.CNBiomes; + +public class ReactorMeltdownExecutor implements IExplosionService { + @Override + public void triggerExplosion(ServerLevel level, BlockPos controllerPos, int reactorSize, int countFuelRod, int notifyRadius, boolean notifyWarnAll) { + BlockPos explosionPos = controllerPos.above(5); + + NotifyUtil.sendTitle(level, controllerPos, + CreateNuclearLang.translate("notification.reactor.destroyed"), + CreateNuclearLang.translate("notification.reactor.meltdown_finished"), + ChatFormatting.DARK_RED, notifyRadius, notifyWarnAll, 10, 60, 20 + ); + + float size = computeExplosionSize(reactorSize, countFuelRod); + + NuclearExplosionEntity explosion = new NuclearExplosionEntity(CNEntityType.NUCLEAR_EXPLOSION.get(), level); + explosion.setPos(explosionPos.getX() + 0.5D, explosionPos.getY() + 10.0D, explosionPos.getZ() - 2.0D); + explosion.setSize(size); + explosion.setNoGriefing(!level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)); + level.addFreshEntity(explosion); + + level.destroyBlock(controllerPos, false); + + BiomeIrradiationService.circularArea(level, explosionPos, CNBiomes.Irradiated.PLAIN, (int) (size * 30)); + + } + + private static float computeExplosionSize(int reactorSize, int countFuelRod) { + // Scales with reactor footprint: 5x5 -> 1.0, 7x7 -> 1.4, 9x9 -> 1.8 + float structureFactor = reactorSize / 5f; + + // Square root gives diminishing returns: each extra uranium rod adds less + // to the radius than the previous one. + float fuelImpact = Mth.sqrt(countFuelRod) * .3f; + + // Final size: constant base + (fuel impact scaled by structure factor) + return Mth.clamp(1.5f + (fuelImpact * structureFactor), 1f, 10f); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorMeltdownMonitor.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorMeltdownMonitor.java new file mode 100644 index 0000000..bc75570 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorMeltdownMonitor.java @@ -0,0 +1,67 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; +import net.nuclearteam.createnuclear.foundation.utility.NotifyUtil; +import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; + +/** + * Default {@link IReactorMeltdownMonitor}. Extracted from + * {@code ReactorControllerBlockEntity.tick()}: the countdown logic and its notifications + * are unchanged from the original implementation, only moved into their own class. + */ +public class ReactorMeltdownMonitor implements IReactorMeltdownMonitor { + /** Ticks of continuous danger before the reactor explodes (15s at 20 TPS). */ + private static final int EXPLOSION_THRESHOLD_TICKS = 300; + /** Last seconds of the countdown during which the flashing "meltdown in" message is shown. */ + private static final int CRITICAL_WINDOW_SECONDS = 10; + + private int explosionCountDown = 0; + + @Override + public MeltdownState tick(Level level, BlockPos pos, boolean isDanger) { + int configRadius = CNConfigs.server().notify.warningDistance.get(); + boolean configWarnAll = CNConfigs.server().notify.warnAllPlayers.get(); + + if (!isDanger) { + boolean wasCountingDown = explosionCountDown > 0; + explosionCountDown = 0; + if (wasCountingDown) { + NotifyUtil.sendActionBar(level, pos, + CreateNuclearLang.translate("notification.reactor.stabilized"), + ChatFormatting.GREEN, configRadius, configWarnAll); + } + return MeltdownState.NONE; + } + + explosionCountDown++; + int secondsLeft = (EXPLOSION_THRESHOLD_TICKS - explosionCountDown) / 20; + + if (secondsLeft <= CRITICAL_WINDOW_SECONDS && secondsLeft > 0) { + boolean isWhite = (level.getGameTime() / 5) % 2 == 0; + ChatFormatting flashColor = isWhite ? ChatFormatting.WHITE : ChatFormatting.RED; + + NotifyUtil.sendActionBar(level, pos, + CreateNuclearLang.translate("notification.reactor.meltdown_in") + .add(CreateNuclearLang.number(secondsLeft)) + .add(CreateNuclearLang.translate("generic.unit.seconds")), + flashColor, configRadius, configWarnAll); + } else if (secondsLeft > CRITICAL_WINDOW_SECONDS && explosionCountDown % 20 == 0) { + NotifyUtil.sendActionBar(level, pos, + CreateNuclearLang.translate("notification.reactor.overheating"), + ChatFormatting.DARK_RED, configRadius, configWarnAll); + } + + if (explosionCountDown >= EXPLOSION_THRESHOLD_TICKS) { + NotifyUtil.sendTitle(level, pos, + CreateNuclearLang.translate("notification.reactor.critical_failure"), + CreateNuclearLang.translate("notification.reactor.imminent_explosion"), + ChatFormatting.DARK_RED, configRadius, configWarnAll, 0, 40, 10); + return MeltdownState.EXPLODE; + } + + return MeltdownState.CRITICAL; + } +} From b85f2a041053ecd5ee497d7db7ffe6071e17699c Mon Sep 17 00:00:00 2001 From: mathi Date: Thu, 6 Aug 2026 15:48:43 +0200 Subject: [PATCH 05/33] feat(reactor): port lot 4 - input snapshot and frame/goggle display Ports the per-tick input snapshot and the display helpers from the Forge branch. No behavioural adaptation was needed on this lot: the differences are the minecraftforge -> neoforged imports and one renamed FluidStack accessor. - ReactorInputSnapshot: byte-identical to Forge. Immutable per-tick view of the loaded rods, coolants and total tank capacity. - ReactorInputSnapshotBuilder: aggregates the live item handlers and tanks once per tick, so heat, tooltip and client sync all read the same numbers. - ReactorFrameDisplayManager: extracts the frameFluidCache* / frameColumn* fields currently inlined in the block entity. Fluid and fill ratio are recomputed at most once per game tick from the same tanks, so they cannot disagree. The block entity keeps its own copies until lot 6 replaces them. - ReactorGoggleTooltipRenderer: stateless, reads only from a ReactorDisplayState snapshot. Uses getHoverName() since FluidStack lost getDisplayName() in 1.21. Its javadoc example is also corrected: the Forge version showed render() being called with four arguments while the method takes five. Co-Authored-By: Claude Opus 5 (1M context) --- PORTAGE_REACTEUR.md | 13 +- .../display/ReactorGoggleTooltipRenderer.java | 139 ++++++++++++++++++ .../manager/ReactorFrameDisplayManager.java | 135 +++++++++++++++++ .../manager/ReactorFrameDisplayManagerI.java | 47 ++++++ .../snapshot/ReactorInputSnapshot.java | 32 ++++ .../snapshot/ReactorInputSnapshotBuilder.java | 49 ++++++ 6 files changed, 412 insertions(+), 3 deletions(-) create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/display/ReactorGoggleTooltipRenderer.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorFrameDisplayManager.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorFrameDisplayManagerI.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/snapshot/ReactorInputSnapshot.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/snapshot/ReactorInputSnapshotBuilder.java diff --git a/PORTAGE_REACTEUR.md b/PORTAGE_REACTEUR.md index 8b22e08..94f0b6f 100644 --- a/PORTAGE_REACTEUR.md +++ b/PORTAGE_REACTEUR.md @@ -166,10 +166,17 @@ Cœur du modèle : équilibre 6:1 fuel/cooler, surchauffe qui s'accélère (`ove > `int[]`, `serializeInventory`, `get/setDisplayState`). Les porter maintenant obligerait à > réécrire le BE, c'est-à-dire à faire le lot 6 — ils partiront donc avec lui. -### Lot 4 — Affichage & snapshot (6 fichiers, ~450 lignes) -`snapshot/ReactorInputSnapshot` · `snapshot/ReactorInputSnapshotBuilder` · `display/ReactorDisplayState` · `display/ReactorGoggleTooltipRenderer` · `manager/ReactorFrameDisplayManagerI` · `manager/ReactorFrameDisplayManager` +### Lot 4 — Affichage & snapshot (6 fichiers, ~450 lignes) ✅ FAIT +`snapshot/ReactorInputSnapshot` · `snapshot/ReactorInputSnapshotBuilder` · `display/ReactorDisplayState` (porté au lot 1) · `display/ReactorGoggleTooltipRenderer` · `manager/ReactorFrameDisplayManagerI` · `manager/ReactorFrameDisplayManager` -`ReactorFrameDisplayManager` remplace les champs `frameFluidCache*` / `frameColumn*` actuellement inlinés dans le BE NeoForge — c'est une extraction, la logique existe déjà et est équivalente. +`ReactorFrameDisplayManager` remplace les champs `frameFluidCache*` / `frameColumn*` actuellement inlinés dans le BE NeoForge — c'est une extraction, la logique existe déjà et est équivalente. Le BE ne sera débarrassé de ses copies qu'au lot 6. + +> Aucune surprise sur ce lot : `ReactorInputSnapshot` est identique à l'octet, les trois +> autres ne diffèrent que par les imports `minecraftforge` → `neoforged`, plus +> `FluidStack.getDisplayName()` → `getHoverName()` dans le renderer. +> +> Le javadoc d'exemple de `ReactorGoggleTooltipRenderer` a été corrigé au passage : côté +> Forge il montrait un appel à `render()` avec 4 arguments alors que la méthode en prend 5. ### Lot 5 — Divers contrôleur (2 fichiers, ~100 lignes) `ReactorRunningSoundInstance` · `ReactorDebugDiagnostics` diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/display/ReactorGoggleTooltipRenderer.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/display/ReactorGoggleTooltipRenderer.java new file mode 100644 index 0000000..5b35b06 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/display/ReactorGoggleTooltipRenderer.java @@ -0,0 +1,139 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.display; + +import com.simibubi.create.foundation.item.TooltipHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.IHeat; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; + +import java.util.List; +import java.util.Map; + +/** + * Builds the Goggles tooltip shown when looking at an assembled reactor controller. + *

+ * This is a stateless presentation helper: it only reads from a + * {@link ReactorDisplayState} snapshot (plus the current heat level) and appends the + * resulting lines to the tooltip. It performs no NBT access, inventory lookups or + * other block-entity-specific logic, keeping the rendering separate from the block + * entity's data/state management. + *

+ * Typical usage from {@code ReactorControllerBlockEntity#addToGoggleTooltip}: + *

{@code
+ * @Override
+ * public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) {
+ *     ReactorGoggleTooltipRenderer.render(tooltip, displayState, heat, isPlayerSneaking, reactorSize);
+ *     return true;
+ * }
+ * }
+ */ +public final class ReactorGoggleTooltipRenderer { + private ReactorGoggleTooltipRenderer() {} + + /** + * Appends the reactor controller's Goggles tooltip lines to {@code tooltip}. + *

+ * Renders, in order: the gauge info header, the reactor heat level, the loaded + * item rods (or a placeholder if none), and the loaded fluids with their fill + * ratio as a progress bar (or a placeholder if none). + * + * @param tooltip the tooltip line list to append to + * @param state the current display snapshot (items, fluids, max fluid capacity) + * @param heat the reactor's current heat value, used to render the heat tooltip line + * @param isPlayerSneaking whether the viewing player is sneaking (currently unused, + * kept for signature parity with other goggle tooltip providers) + * @param reactorSize the reactor's multiblock size, used to resolve the heat thresholds + */ + public static void render(List tooltip, ReactorDisplayState state, int heat, boolean isPlayerSneaking, int reactorSize) { + renderHeaderAndHeat(tooltip, heat, reactorSize); + renderItemRods(tooltip, state); + renderFluidTanks(tooltip, state); + } + + /** + * Appends the gauge info header and the reactor's current heat level line. + * + * @param tooltip the tooltip line list to append to + * @param heat the reactor's current heat value + */ + private static void renderHeaderAndHeat(List tooltip, int heat, int reactorSize) { + CreateLang.translate("gui.gauge.info_header") + .style(ChatFormatting.GRAY) + .forGoggles(tooltip); + IHeat.HeatLevel.getName("reactor_controller").style(ChatFormatting.GRAY).forGoggles(tooltip); + + IHeat.HeatLevel.getFormattedHeatText(heat, reactorSize).forGoggles(tooltip); + } + + /** + * Appends one line per loaded item rod with its stacked count, or a placeholder + * line showing a count of 0 if no rods are loaded. + * + * @param tooltip the tooltip line list to append to + * @param state the current display snapshot + */ + private static void renderItemRods(List tooltip, ReactorDisplayState state) { + if (state.items().isEmpty()) { + CreateNuclearLang.builder() + .add(Component.translatable("createnuclear.tooltip.item.empty.rod").withStyle(ChatFormatting.GRAY)) + .add(CreateNuclearLang.number(0).style(ChatFormatting.GOLD)) + .forGoggles(tooltip); + } else { + for (Map.Entry entry : state.items().entrySet()) { + ItemStack stack = new ItemStack(entry.getKey()); + int count = entry.getValue(); + CreateNuclearLang.itemName(stack) + .style(ChatFormatting.GRAY) + .text(": ") + .add(CreateNuclearLang.number(count).style(ChatFormatting.GOLD)) + .forGoggles(tooltip); + } + } + } + + /** + * Appends one line per loaded fluid with a fill-ratio progress bar relative to + * {@link ReactorDisplayState#maxFluidCapacity()}, or a "no fluid" placeholder + * with an empty progress bar if no fluids are loaded. + * + * @param tooltip the tooltip line list to append to + * @param state the current display snapshot + */ + private static void renderFluidTanks(List tooltip, ReactorDisplayState state) { + if (state.fluids().isEmpty()) { + CreateNuclearLang.translate("tooltip.fluid.none") + .style(ChatFormatting.GRAY) + .forGoggles(tooltip); + + CreateNuclearLang.builder() + .text(TooltipHelper.makeProgressBar(5, 0)) + .style(ChatFormatting.BLUE) + .space() + .text("0%") + .forGoggles(tooltip); + } else { + long maxCapacity = state.maxFluidCapacity(); + for (BigFluidStack stack : state.fluids()) { + float fillRatio = maxCapacity > 0 ? (float) stack.amount / maxCapacity : 0; + if (fillRatio >= 0.99f) + fillRatio = 1.0f; + int filledBars = Math.round(fillRatio * 5); + + CreateNuclearLang.translate("tooltip.fluid", stack.stack.getHoverName()) + .style(ChatFormatting.GRAY) + .forGoggles(tooltip); + + CreateNuclearLang.builder() + .text(TooltipHelper.makeProgressBar(5, filledBars)) + .style(ChatFormatting.BLUE) + .space() + .text(Math.round(fillRatio * 100) + "%") + .forGoggles(tooltip); + } + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorFrameDisplayManager.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorFrameDisplayManager.java new file mode 100644 index 0000000..1ec4369 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorFrameDisplayManager.java @@ -0,0 +1,135 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.manager; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.Level; +import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.capability.IFluidHandler; +import org.jetbrains.annotations.Nullable; + +public class ReactorFrameDisplayManager implements ReactorFrameDisplayManagerI { + public static final String COMPONENT_FRAME_COLUMN_MIN_Y = "frameColumnMinY"; + public static final String COMPONENT_FRAME_COLUMN_MAX_Y = "frameColumnMaxY"; + + // Vertical span (block Y) of the reactor frame columns, used to map the + // fluid fill ratio onto the liquid actually drawn in the frame windows. + private int frameColumnMinY = Integer.MAX_VALUE; + private int frameColumnMaxY = Integer.MIN_VALUE; + + // Per-tick cache for the fluid drawn in the frame windows. Recomputed from the + // live (synced) input tanks so the displayed fluid and its fill ratio always + // come from the same source and stay consistent for every fluid type. + private long frameFluidCacheTick = -1; + private float frameFluidFillRatioCache = 0f; + + private FluidStack frameFluidCache = FluidStack.EMPTY; + + /** + * Returns the fluid currently held by the reactor, used by the frame + * renderer to draw the matching liquid in the window. On the client this + * reads the synced ; on the server it reads the + * aggregated . Returns {@link FluidStack#EMPTY} when + * the reactor holds no fluid. + *

+ * Recomputes, at most once per game tick, the fluid shown in the frame + * windows and how full the input is. Both values are read from the same live + * input tanks (whose contents are synced to the client), so they always agree + * regardless of the fluid type. + */ + private void refreshFrameFluidCache(@Nullable Level level, ReactorInputFluidManagerI handlers) { + if (level == null) return; + long now = level.getGameTime(); + + if (now == frameFluidCacheTick) return; + frameFluidCacheTick = now; + + long amount = 0, capacity = 0; + FluidStack fluid = FluidStack.EMPTY; + + for (IFluidHandler handler : handlers.getFuildHandlers(level)) { + int tanks = handler.getTanks(); + for (int t = 0; t < tanks; t++) { + FluidStack stack = handler.getFluidInTank(t); + capacity += handler.getTankCapacity(t); + amount += stack.getAmount(); + + if (fluid.isEmpty() && !stack.isEmpty()) fluid = stack.copy(); + } + } + + frameFluidCache = fluid; + frameFluidFillRatioCache = capacity > 0 ? Math.min(1f, (float) amount / (float) capacity) : 0f; + } + + /** + * The fluid currently shown in the reactor frame windows (may be empty). + */ + @Override + public FluidStack getDisplayedFluid(Level level, ReactorInputFluidManagerI handlers) { + refreshFrameFluidCache(level, handlers); + + return frameFluidCache; + } + + /** + * How full the reactor's fluid input is, in the range {@code [0, 1]}, used by + * the frame renderer to size the visible liquid column. + */ + @Override + public float getDisplayedFluidFillRatio(Level level, ReactorInputFluidManagerI handlers) { + refreshFrameFluidCache(level, handlers); + + return frameFluidFillRatioCache; + } + + /** + * Records the lowest and highest frame block-Y of the assembled reactor. + */ + @Override + public void setFrameColumn(int minY, int maxY, Runnable onChange) { + if (this.frameColumnMinY == minY && this.frameColumnMaxY == maxY) return; + this.frameColumnMinY = minY; + this.frameColumnMaxY = maxY; + onChange.run(); + } + + /** + * @return the lowest frame block-Y, or {@link Integer#MAX_VALUE} if unknown. + */ + @Override + public int getFrameColumnMinY() { + return frameColumnMinY; + } + + /** + * @return the highest frame block-Y, or {@link Integer#MIN_VALUE} if unknown. + */ + @Override + public int getFrameColumnMaxY() { + return frameColumnMaxY; + } + + @Override + public boolean hasFrameColumn() { + return frameColumnMinY != Integer.MAX_VALUE && frameColumnMaxY != Integer.MIN_VALUE + && frameColumnMaxY >= frameColumnMinY; + } + + @Override + public void read(CompoundTag compound) { + if (compound.contains(COMPONENT_FRAME_COLUMN_MIN_Y)) { + frameColumnMinY = compound.getInt(COMPONENT_FRAME_COLUMN_MIN_Y); + } + + if (compound.contains(COMPONENT_FRAME_COLUMN_MAX_Y)) { + frameColumnMaxY = compound.getInt(COMPONENT_FRAME_COLUMN_MAX_Y); + } + } + + @Override + public void write(CompoundTag compound) { + if (hasFrameColumn()) { + compound.putInt(COMPONENT_FRAME_COLUMN_MIN_Y, frameColumnMinY); + compound.putInt(COMPONENT_FRAME_COLUMN_MAX_Y, frameColumnMaxY); + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorFrameDisplayManagerI.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorFrameDisplayManagerI.java new file mode 100644 index 0000000..49bfdcf --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorFrameDisplayManagerI.java @@ -0,0 +1,47 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.manager; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.Level; +import net.neoforged.neoforge.fluids.FluidStack; + +/** + * Manages the display state of the reactor frame windows: the fluid shown, + * its fill ratio, and the vertical column bounds of the assembled frame. + */ +public interface ReactorFrameDisplayManagerI { + /** + * Returns the fluid currently shown in the reactor frame windows (may be + * empty). Recomputes the underlying cache at most once per game tick from + * the given fluid handlers. + */ + FluidStack getDisplayedFluid(Level level, ReactorInputFluidManagerI handlers); + + /** + * Returns how full the reactor's fluid input is, in the range {@code [0, 1]}. + * Recomputes the underlying cache at most once per game tick from the + * given fluid handlers. + */ + float getDisplayedFluidFillRatio(Level level, ReactorInputFluidManagerI handlers); + + /** + * Records the lowest and highest frame block-Y of the assembled reactor. + * If the values changed, {@code onChange} is invoked (e.g. to trigger a + * client sync via {@code notifyUpdate()}). + */ + void setFrameColumn(int minY, int maxY, Runnable onChange); + + /** @return the lowest frame block-Y, or {@link Integer#MAX_VALUE} if unknown. */ + int getFrameColumnMinY(); + + /** @return the highest frame block-Y, or {@link Integer#MIN_VALUE} if unknown. */ + int getFrameColumnMaxY(); + + /** @return true if both frame column bounds are known and consistent. */ + boolean hasFrameColumn(); + + /** Reads state from an NBT tag (deserialization). */ + void read(CompoundTag compound); + + /** Writes state to an NBT tag (serialization). */ + void write(CompoundTag compound); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/snapshot/ReactorInputSnapshot.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/snapshot/ReactorInputSnapshot.java new file mode 100644 index 0000000..b9e5575 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/snapshot/ReactorInputSnapshot.java @@ -0,0 +1,32 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.snapshot; + +import net.minecraft.world.item.Item; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; + +import java.util.List; +import java.util.Map; + +/** + * Snapshot of the reactor's inputs, collected once per tick. + *

+ * {@code items} reflects the items actually present (for tooltip display). + * {@code bigFuelItem}/{@code bigCoolerItem} are derived from + * {@link net.nuclearteam.createnuclear.content.multiblock.input.item.VirtualReactorInputsItem} and always represent, respectively, + * Uranium Rod / Graphite Rod (generic tag-based count, fixed identity) — + * do not use these fields to infer the actual item type loaded. + *

+ * The elements of {@code fluids} ({@link BigFluidStack}) remain mutable + * (public fields); this snapshot only guarantees immutability of the + * list/map structure, not of their contents. + */ + +public record ReactorInputSnapshot(Map items, List fluids, long maxFluidCapacity) { + public static final ReactorInputSnapshot EMPTY = new ReactorInputSnapshot( + Map.of(), List.of(), 0 + ); + + public ReactorInputSnapshot { + items = Map.copyOf(items); + fluids = List.copyOf(fluids); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/snapshot/ReactorInputSnapshotBuilder.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/snapshot/ReactorInputSnapshotBuilder.java new file mode 100644 index 0000000..9396e27 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/snapshot/ReactorInputSnapshotBuilder.java @@ -0,0 +1,49 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.snapshot; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.neoforged.neoforge.fluids.capability.IFluidHandler; +import net.neoforged.neoforge.items.IItemHandler; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputFluidManagerI; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputManagerI; +import net.nuclearteam.createnuclear.content.multiblock.input.fluid.VirtualReactorInputFluid; +import net.nuclearteam.createnuclear.content.multiblock.input.item.VirtualReactorInputsItem; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ReactorInputSnapshotBuilder { + private ReactorInputSnapshotBuilder() {} + + public static ReactorInputSnapshot build(Level level, ReactorInputManagerI inputManager, ReactorInputFluidManagerI inputFluidManager) { + // Populate display fields for client sync + Map items = new HashMap<>(); + List itemHandlers = inputManager.getItemHandlers(level); + for (IItemHandler h : itemHandlers) { + for (int s = 0; s < h.getSlots(); s++) { + ItemStack st = h.getStackInSlot(s); + if (!st.isEmpty()) { + items.merge(st.getItem(), st.getCount(), Integer::sum); + } + } + } + + long maxFluidCapacity = 0; + for (IFluidHandler h : inputFluidManager.getFuildHandlers(level)) { + if (h.getTanks() > 0) { + maxFluidCapacity += h.getTankCapacity(0); + } + } + + VirtualReactorInputsItem virtualItems = inputManager.getInventory(level); + VirtualReactorInputFluid virtualFluid = inputFluidManager.getInventory(level); + List fluids = VirtualReactorInputFluid.toBigList(virtualFluid.fluids()); + + + + return new ReactorInputSnapshot(items, fluids, maxFluidCapacity); + } +} From 6ab2da30232298a1ded4bb0993bed863fc860cc9 Mon Sep 17 00:00:00 2001 From: mathi Date: Thu, 6 Aug 2026 15:51:38 +0200 Subject: [PATCH 06/33] feat(reactor): port lot 5 - running sound and debug diagnostics Both files are byte-identical to their Forge counterpart: no API adaptation was needed. AbstractTickableSoundInstance is unchanged between 1.20.1 and 1.21, and the already-ported ReactorAlarmSoundInstance confirms the shape. - ReactorRunningSoundInstance: looping client-side sound driven by the ACTIVE blockstate added in lot 0. It stops itself when the block stops being an active controller, so it survives the controller being broken or the block entity's tick no longer driving it. - ReactorDebugDiagnostics: dumps registered vs. currently valid positions for each of the four IO managers. Adds the eight createnuclear.reactor.debug.* lang keys, which were missing from lang/default/reactor.json. The nine notification.reactor.* keys that lot 3's ReactorMeltdownMonitor depends on were already present. runData is needed to propagate the new keys into the generated en_us.json. Co-Authored-By: Claude Opus 5 (1M context) --- PORTAGE_REACTEUR.md | 10 ++- .../controller/ReactorDebugDiagnostics.java | 57 +++++++++++++++++ .../ReactorRunningSoundInstance.java | 61 +++++++++++++++++++ .../createnuclear/lang/default/reactor.json | 11 +++- 4 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorDebugDiagnostics.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorRunningSoundInstance.java diff --git a/PORTAGE_REACTEUR.md b/PORTAGE_REACTEUR.md index 94f0b6f..57cad2d 100644 --- a/PORTAGE_REACTEUR.md +++ b/PORTAGE_REACTEUR.md @@ -178,9 +178,17 @@ Cœur du modèle : équilibre 6:1 fuel/cooler, surchauffe qui s'accélère (`ove > Le javadoc d'exemple de `ReactorGoggleTooltipRenderer` a été corrigé au passage : côté > Forge il montrait un appel à `render()` avec 4 arguments alors que la méthode en prend 5. -### Lot 5 — Divers contrôleur (2 fichiers, ~100 lignes) +### Lot 5 — Divers contrôleur (2 fichiers, ~100 lignes) ✅ FAIT `ReactorRunningSoundInstance` · `ReactorDebugDiagnostics` +> Les deux fichiers sont **identiques à l'octet** — aucune adaptation d'API. `AbstractTickableSoundInstance` +> n'a pas bougé entre 1.20.1 et 1.21, et `ReactorAlarmSoundInstance` (déjà porté) sert de témoin. +> +> En revanche les 8 clés `createnuclear.reactor.debug.*` manquaient dans +> `lang/default/reactor.json` — ajoutées. Les 9 clés `notification.reactor.*` dont dépend le +> `ReactorMeltdownMonitor` du lot 3, elles, existaient déjà. `runData` est nécessaire pour +> répercuter les nouvelles clés dans `en_us.json`. + ### Lot 6 — Réécriture du block entity Remplacement de `ReactorControllerBlockEntity` (735 → ~440 lignes) et branchement de tout le reste. diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorDebugDiagnostics.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorDebugDiagnostics.java new file mode 100644 index 0000000..e1e7b74 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorDebugDiagnostics.java @@ -0,0 +1,57 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.*; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; + +import java.util.Collection; + +public class ReactorDebugDiagnostics { + private static final String TITLE = "reactor.debug.title"; + private static final String SUMMARY = "reactor.debug.summary"; + private static final String REGISTERED_POSITION = "reactor.debug.registered_position"; + private static final String VALID_POSITION = "reactor.debug.valid_position"; + + private static final String INPUT = "reactor.debug.label.input"; + private static final String INPUT_FLUID = "reactor.debug.label.fluid_input"; + private static final String OUTPUT = "reactor.debug.label.output"; + private static final String ALARM = "reactor.debug.label.alarm"; + + private ReactorDebugDiagnostics() {} + + public static void sendReactorConnectionsTo(Player player, Level level, + ReactorInputManagerI inputManager, ReactorInputFluidManagerI inputFluidManager, + ReactorOutputManagerI outputManager, + ReactorAlarmManagerI alarmManager + ) { + player.sendSystemMessage(CreateNuclearLang.translate(TITLE).style(ChatFormatting.GOLD).component()); + + sendManagerSummary(player, CreateNuclearLang.translate(INPUT).component(), + inputManager.size(), inputManager.getBlocksPosition(), inputManager.getBlocksPosition(level)); + + sendManagerSummary(player, CreateNuclearLang.translate(INPUT_FLUID).component(), + inputFluidManager.size(), inputFluidManager.getBlocksPosition(), inputFluidManager.getBlocksPosition(level)); + + sendManagerSummary(player, CreateNuclearLang.translate(OUTPUT).component(), + outputManager.size(), outputManager.getBlocksPosition(), outputManager.getBlocksPosition(level)); + + sendManagerSummary(player, CreateNuclearLang.translate(ALARM).component(), + alarmManager.size(), alarmManager.getBlocksPosition(), alarmManager.getBlocksPosition(level)); + } + + private static void sendManagerSummary(Player player, Component label, int registeredCount, + Collection registered, Collection valid) { + player.sendSystemMessage(CreateNuclearLang.translate(SUMMARY, label, registeredCount, valid.size()).style(ChatFormatting.YELLOW).component()); + + for (BlockPos pos : registered) { + player.sendSystemMessage(CreateNuclearLang.translate(REGISTERED_POSITION, pos.toShortString()).component()); + } + for (BlockPos pos : valid) { + player.sendSystemMessage(CreateNuclearLang.translate(VALID_POSITION, pos.toShortString()).component()); + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorRunningSoundInstance.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorRunningSoundInstance.java new file mode 100644 index 0000000..52f39cb --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorRunningSoundInstance.java @@ -0,0 +1,61 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller; + +import net.minecraft.client.resources.sounds.AbstractTickableSoundInstance; +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.nuclearteam.createnuclear.CreateNuclear; + +/** + * Client-side looping sound played while a reactor is actively producing energy. + *

+ * Mirrors {@code ReactorAlarmSoundInstance}: the instance stops itself once the block at + * {@code pos} is no longer a running reactor controller (the {@code ACTIVE} blockstate property + * is synced from the server), so it survives the controller block being broken or the reactor + * shutting down even if the owning block entity's tick stops driving it. + */ +public class ReactorRunningSoundInstance extends AbstractTickableSoundInstance { + private final BlockPos pos; + private final Level level; + + public ReactorRunningSoundInstance(Level level, BlockPos pos, SoundEvent sound) { + super(sound, SoundSource.BLOCKS, level != null ? level.random : null); + this.level = level; + this.pos = pos; + if (pos != null) { + this.x = pos.getX(); + this.y = pos.getY(); + this.z = pos.getZ(); + } + this.looping = true; + this.delay = 0; + this.volume = 1.0F; + } + + @Override + public void tick() { + try { + if (level == null || pos == null) { + stop(); + return; + } + + BlockState state = level.getBlockState(pos); + if (!(state.getBlock() instanceof ReactorControllerBlock) + || !state.hasProperty(ReactorControllerBlock.ACTIVE) + || !state.getValue(ReactorControllerBlock.ACTIVE)) { + stop(); + } + } catch (Exception e) { + stop(); + CreateNuclear.LOGGER.warn(e.getMessage()); + } + } + + /** Public entry point so the owning block entity can stop the loop ({@link #stop()} is protected). */ + public void stopSound() { + stop(); + } +} diff --git a/src/main/resources/assets/createnuclear/lang/default/reactor.json b/src/main/resources/assets/createnuclear/lang/default/reactor.json index 67908b9..1ca9977 100644 --- a/src/main/resources/assets/createnuclear/lang/default/reactor.json +++ b/src/main/resources/assets/createnuclear/lang/default/reactor.json @@ -4,5 +4,14 @@ "reactor.info.assembled.creator": "Reactor has been assembled", "reactor.info.is": "controller is", "reactor.item.gui.name": "Config Pattern", - "reactor.update.casing.input": "Update the casing in input" + "reactor.update.casing.input": "Update the casing in input", + + "createnuclear.reactor.debug.title": "--- Reactor diagnostics ---", + "createnuclear.reactor.debug.summary": "%s: %s registered, %s valid", + "createnuclear.reactor.debug.registered_position": " registered @ %s", + "createnuclear.reactor.debug.valid_position": " valid @ %s", + "createnuclear.reactor.debug.label.input": "Input", + "createnuclear.reactor.debug.label.fluid_input": "Fluid Input", + "createnuclear.reactor.debug.label.output": "Output", + "createnuclear.reactor.debug.label.alarm": "Alarm" } \ No newline at end of file From 49c7fb7c247daf7aff93f2da1b1fc74e2aa4aad8 Mon Sep 17 00:00:00 2001 From: mathi Date: Thu, 6 Aug 2026 16:30:18 +0200 Subject: [PATCH 07/33] feat(reactor): port lot 6 - rewire the controller block entity Replaces the monolithic NeoForge controller with the Forge one and wires it to the 33 files ported in lots 0-5. ReactorControllerBlockEntity goes from 868 lines to 424, and its divergence from Forge from 864 lines to 76 - all of them 1.21 adaptations (HolderLookup.Provider on read/write, DataComponents instead of raw NBT, neoforged imports). The reactor now actually runs: heat model, overheat escalation, meltdown countdown with its notifications, explosion, alarms, coolant consumption, rod consumption cycles, the ACTIVE blockstate driving the running sound and the lit controller texture, and the goggle tooltip fed from the synced snapshot. Carried along: ReactorControllerBlock, ReactorAssembler, CNMultiblock, ReactorPattern, MultiblockHelpers, ReactorOutput(Entity), ReactorOutputManager, ReactorFrame(Renderer), ReactorCasing, ReactorCooler, ReactorCoreEntity, ReactorRodInput, the two persistence services deferred from lot 3, and IMultiblockController (lot 7). Four features turned out to be missing rather than merely reorganized: - Only the 5x5 reactor existed. CNMultiblock registered a single pattern with the rod input and output pinned to fixed positions; Forge registers three (5x5 / 7x7 / 9x9) where IO blocks sit anywhere on the shell. 7x7 and 9x9 were simply impossible to assemble. - ReactorFrameEntity was never registered. The class and its renderer both existed, but no BlockEntityEntry did, so frame blocks had no block entity at all and the fluid could never render in the windows. - Fluid capacity was multiplied by the number of inputs. applyReactorTierCapacity gave every input the reactor's full capacity, so four inputs held four times the intended total. Replaced by applyCapacity(int), with the assembler splitting the total as Forge does. - ReactorOutputEntity drove its speed through a KineticScrollValueBehaviour instead of the manager-driven persisted generatedSpeed, which also kept the DIR interaction on ReactorOutput that Forge had dropped. Note for future syncs: in tick(), `int heat = ...` is deliberately a local shadowing the field, exactly as on Forge. Promoting it to a field assignment would change the previousHeat value fed to the heat calculation. CNShapes.REACTOR_INPUT and CNBlockEntityTypes.REACTOR_INPUT keep their NeoForge names (Forge: REACTOR_ROD_INPUT); renaming them would change the createnuclear:reactor_input registry id and break existing worlds. Co-Authored-By: Claude Opus 5 (1M context) --- PORTAGE_REACTEUR.md | 39 +- .../createnuclear/CNBlockEntityTypes.java | 8 + .../api/multiblock/IMultiblockController.java | 8 + .../api/multiblock/MultiBlockManagerBeta.java | 2 +- .../content/multiblock/CNMultiblock.java | 80 +- .../content/multiblock/MultiblockHelpers.java | 22 +- .../content/multiblock/ReactorAssembler.java | 101 +- .../multiblock/casing/ReactorCasing.java | 47 +- .../controller/ReactorControllerBlock.java | 162 ++-- .../ReactorControllerBlockEntity.java | 888 ++++++------------ .../manager/ReactorOutputManager.java | 123 +-- .../manager/ReactorOutputManagerI.java | 19 +- .../service/DefaultPersistenceService.java | 51 + .../service/IPersistenceService.java | 18 + .../multiblock/cooler/ReactorCooler.java | 47 +- .../multiblock/core/ReactorCoreEntity.java | 75 +- .../multiblock/frame/ReactorFrame.java | 62 +- .../frame/ReactorFrameRenderer.java | 18 +- .../input/fluid/ReactorFluidInputEntity.java | 12 +- .../input/item/ReactorRodInput.java | 71 +- .../input/item/ReactorRodInputEntity.java | 23 - .../multiblock/output/ReactorOutput.java | 112 +-- .../output/ReactorOutputEntity.java | 163 ++-- .../multiblock/pattern/ReactorPattern.java | 151 ++- 24 files changed, 973 insertions(+), 1329 deletions(-) create mode 100644 src/main/java/net/nuclearteam/createnuclear/api/multiblock/IMultiblockController.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/DefaultPersistenceService.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IPersistenceService.java diff --git a/PORTAGE_REACTEUR.md b/PORTAGE_REACTEUR.md index 57cad2d..a2cc9eb 100644 --- a/PORTAGE_REACTEUR.md +++ b/PORTAGE_REACTEUR.md @@ -189,11 +189,40 @@ Cœur du modèle : équilibre 6:1 fuel/cooler, surchauffe qui s'accélère (`ove > `ReactorMeltdownMonitor` du lot 3, elles, existaient déjà. `runData` est nécessaire pour > répercuter les nouvelles clés dans `en_us.json`. -### Lot 6 — Réécriture du block entity -Remplacement de `ReactorControllerBlockEntity` (735 → ~440 lignes) et branchement de tout le reste. - -### Lot 7 — API multiblock -`api/multiblock/IMultiblockController.java` — interface implémentée par le BE Forge, absente côté NeoForge. +### Lot 6 — Réécriture du block entity ✅ FAIT (lot 7 inclus) +`ReactorControllerBlockEntity` passe de **868 lignes monolithiques à 424 lignes** qui délèguent +aux 33 fichiers des lots 0-5. Divergence vs Forge : **864 lignes → 76**, toutes des adaptations +1.21 (`HolderLookup.Provider`, DataComponents, imports `neoforged`). + +Fichiers portés avec : `ReactorControllerBlock` · `ReactorAssembler` · `CNMultiblock` · +`ReactorPattern` · `MultiblockHelpers` · `ReactorOutput` · `ReactorOutputEntity` · +`ReactorOutputManager(I)` · `ReactorFrame` · `ReactorFrameRenderer` · `ReactorCasing` · +`ReactorCooler` · `ReactorCoreEntity` · `ReactorRodInput` · `IPersistenceService` / +`DefaultPersistenceService` · `IMultiblockController` (lot 7). + +> **Features réellement absentes de NeoForge, découvertes en câblant :** +> +> 1. **Seul le réacteur 5×5 existait.** `CNMultiblock` n'enregistrait qu'un multiblock, avec +> entrée et sortie à positions fixes. Forge en enregistre trois (5×5 / 7×7 / 9×9) où les I/O +> se placent librement sur l'enveloppe. Les 7×7 et 9×9 étaient donc **impossibles à assembler**. +> 2. **`ReactorFrameEntity` n'était jamais enregistré.** La classe et son renderer existaient, +> mais sans `BlockEntityEntry` dans `CNBlockEntityTypes` : le bloc frame n'avait aucune block +> entity, donc le rendu du fluide dans les vitres ne pouvait pas fonctionner. Ajouté. +> 3. **La capacité de fluide était multipliée par le nombre d'entrées.** `applyReactorTierCapacity` +> donnait à *chaque* entrée la capacité totale du réacteur ; 4 entrées = 4× la capacité prévue. +> Remplacé par `applyCapacity(int)`, l'assembleur répartissant le total comme sur Forge. +> 4. **`ReactorOutputEntity` utilisait un `KineticScrollValueBehaviour`** (vitesse réglable à la +> molette) au lieu du `generatedSpeed` persisté piloté par le manager. Remplacé, ce qui +> supprime aussi l'interaction `DIR` sur `ReactorOutput` que Forge avait retirée. +> +> **Piège évité :** Forge déclare `int heat = ...` dans `tick()` en variable **locale masquant le +> champ** — donc morte. Une lecture rapide pousse à en faire une affectation du champ, ce qui +> changerait la valeur de `previousHeat` passée au calcul. La sémantique Forge est conservée. + +**Divergences résiduelles assumées** (à ne pas « corriger » lors d'une synchro) : +`CNShapes.REACTOR_INPUT` et `CNBlockEntityTypes.REACTOR_INPUT` gardent leur nom NeoForge +(Forge : `REACTOR_ROD_INPUT`) — les renommer changerait l'identifiant de registre +`createnuclear:reactor_input` et casserait les mondes existants. --- diff --git a/src/main/java/net/nuclearteam/createnuclear/CNBlockEntityTypes.java b/src/main/java/net/nuclearteam/createnuclear/CNBlockEntityTypes.java index ca312d4..6c65045 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNBlockEntityTypes.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNBlockEntityTypes.java @@ -8,6 +8,8 @@ import net.nuclearteam.createnuclear.content.multiblock.casing.ReactorCasingEntity; import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; import net.nuclearteam.createnuclear.content.multiblock.core.ReactorCoreEntity; +import net.nuclearteam.createnuclear.content.multiblock.frame.ReactorFrameEntity; +import net.nuclearteam.createnuclear.content.multiblock.frame.ReactorFrameRenderer; import net.nuclearteam.createnuclear.content.multiblock.input.fluid.ReactorFluidInputEntity; import net.nuclearteam.createnuclear.content.multiblock.input.item.ReactorRodInputEntity; import net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutputEntity; @@ -29,6 +31,12 @@ public class CNBlockEntityTypes { .validBlocks(CNBlocks.REACTOR_CORE) .register(); + public static final BlockEntityEntry REACTOR_FRAME = + CreateNuclear.REGISTRATE.blockEntity("reactor_frame", ReactorFrameEntity::new) + .validBlocks(CNBlocks.REACTOR_FRAME) + .renderer(() -> ReactorFrameRenderer::new) + .register(); + public static final BlockEntityEntry REACTOR_INPUT = CreateNuclear.REGISTRATE.blockEntity("reactor_input", ReactorRodInputEntity::new) .validBlocks(CNBlocks.REACTOR_ROD_INPUT) diff --git a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/IMultiblockController.java b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/IMultiblockController.java new file mode 100644 index 0000000..7a9478d --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/IMultiblockController.java @@ -0,0 +1,8 @@ +package net.nuclearteam.createnuclear.api.multiblock; + +import net.minecraft.core.Direction; + +public interface IMultiblockController { + void setMultiblockFacing(Direction f); + Direction getMultiblockFacing(); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/MultiBlockManagerBeta.java b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/MultiBlockManagerBeta.java index 7079cd3..1cce9b9 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/MultiBlockManagerBeta.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/MultiBlockManagerBeta.java @@ -30,7 +30,7 @@ public BlockPattern findStructure(Level level, BlockPos pos, ReactorControlle for (BlockPattern structure : structures) { boolean result = structure.structure().matches(level, pos, direction); if (result){ - entity.setMultiblockFacing(direction.getCounterClockWise().getName()); + entity.setMultiblockFacing(direction.getCounterClockWise()); return structure; } } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/CNMultiblock.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/CNMultiblock.java index 60164c4..aa5a500 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/CNMultiblock.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/CNMultiblock.java @@ -12,32 +12,76 @@ public class CNMultiblock { public static final MultiBlockManagerBeta REGISTRATE_MULTIBLOCK = new MultiBlockManagerBeta<>(); - public static final String AAAAA = "AAAAA"; - public static final String AABAA = "AABAA"; - public static final String ADADA = "ADADA"; - public static final String BACAB = "BACAB"; - public static final String AAIAA = "AAIAA"; - public static final String AAAA = "AA*AA"; - public static final String AAOAA = "AAOAA"; + + private static final Predicate blockInWorldAPredicate = state -> + stateIs(CNBlocks.REACTOR_CASING.get()).test(state) + || stateIs(CNBlocks.REACTOR_OUTPUT.get()).test(state) + || stateIs(CNBlocks.REACTOR_ROD_INPUT.get()).test(state) + || stateIs(CNBlocks.REACTOR_FLUID_INPUT.get()).test(state) + || stateIs(CNBlocks.REACTOR_ALARM.get()).test(state) + ; static { - REGISTRATE_MULTIBLOCK.register("createnuclear:reactor", + REGISTRATE_MULTIBLOCK.register("createnuclear:reactor5x5", TypeMultiblock.REACTOR_T1, SimpleMultiBlockAislePatternBuilder.start() - .aisle(AAAAA, AAAAA, AAAAA, AAAAA, AAAAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AAIAA, ADADA, BACAB, ADADA, AAAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AAAAA, AAAAA, AAAAA, AAAAA, AAOAA) - .where('A', stateIs(CNBlocks.REACTOR_CASING.get())) + .aisle("OOOOO", "OAAAO", "OAAAO", "OAAAO", "OOOOO") + .aisle("OABAO", "ADDDA", "BDCDB", "ADDDA", "OABAO") + .aisle("OABAO", "ADDDA", "BDCDB", "ADDDA", "OABAO") + .aisle("OABAO", "ADDDA", "BDCDB", "ADDDA", "OA*AO") + .aisle("OABAO", "ADDDA", "BDCDB", "ADDDA", "OABAO") + .aisle("OABAO", "ADDDA", "BDCDB", "ADDDA", "OABAO") + .aisle("OOOOO", "OAAAO", "OAAAO", "OAAAO", "OOOOO") + .where('A', blockInWorldAPredicate) .where('B', stateIs(CNBlocks.REACTOR_FRAME.get())) .where('C', stateIs(CNBlocks.REACTOR_CORE.get())) .where('D', stateIs(CNBlocks.REACTOR_COOLER.get())) .where('*', stateIs(CNBlocks.REACTOR_CONTROLLER.get())) - .where('O', stateIs(CNBlocks.REACTOR_OUTPUT.get())) - .where('I', stateIs(CNBlocks.REACTOR_ROD_INPUT.get())) + .where('O', stateIs(CNBlocks.REACTOR_CASING.get())) + .build() + ); + + REGISTRATE_MULTIBLOCK.register("createnuclear:reactor7x7", + TypeMultiblock.REACTOR_T2, + SimpleMultiBlockAislePatternBuilder.start() + .aisle("OOOOOOO", "OAAAAAO", "OAAAAAO", "OAAAAAO", "OAAAAAO", "OAAAAAO", "OOOOOOO") + .aisle("OABABAO", "ADDDDDA", "BDCDCDB", "ADDDDDA", "BDCDCDB", "ADDDDDA", "OABABAO") + .aisle("OABABAO", "ADDDDDA", "BDCDCDB", "ADDDDDA", "BDCDCDB", "ADDDDDA", "OABABAO") + .aisle("OABABAO", "ADDDDDA", "BDCDCDB", "ADDDDDA", "BDCDCDB", "ADDDDDA", "OABABAO") + .aisle("OABABAO", "ADDDDDA", "BDCDCDB", "ADDDDDA", "BDCDCDB", "ADDDDDA", "OAB*BAO") + .aisle("OABABAO", "ADDDDDA", "BDCDCDB", "ADDDDDA", "BDCDCDB", "ADDDDDA", "OABABAO") + .aisle("OABABAO", "ADDDDDA", "BDCDCDB", "ADDDDDA", "BDCDCDB", "ADDDDDA", "OABABAO") + .aisle("OABABAO", "ADDDDDA", "BDCDCDB", "ADDDDDA", "BDCDCDB", "ADDDDDA", "OABABAO") + .aisle("OOOOOOO", "OAAAAAO", "OAAAAAO", "OAAAAAO", "OAAAAAO", "OAAAAAO", "OOOOOOO") + .where('A', blockInWorldAPredicate) + .where('B', a -> a.getState().is(CNBlocks.REACTOR_FRAME.get())) + .where('C', a -> a.getState().is(CNBlocks.REACTOR_CORE.get())) + .where('D', a -> a.getState().is(CNBlocks.REACTOR_COOLER.get())) + .where('*', a -> a.getState().is(CNBlocks.REACTOR_CONTROLLER.get())) + .where('O', a -> a.getState().is(CNBlocks.REACTOR_CASING.get())) + .build() + ); + + REGISTRATE_MULTIBLOCK.register("createnuclear:reactor9x9", + TypeMultiblock.REACTOR_T3, + SimpleMultiBlockAislePatternBuilder.start() + .aisle("OOOOOOOOO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OOOOOOOOO") + .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") + .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") + .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") + .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") + .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAA*AABO") + .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") + .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") + .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") + .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") + .aisle("OOOOOOOOO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OOOOOOOOO") + .where('A', blockInWorldAPredicate) + .where('B', a -> a.getState().is(CNBlocks.REACTOR_FRAME.get())) + .where('C', a -> a.getState().is(CNBlocks.REACTOR_CORE.get())) + .where('D', a -> a.getState().is(CNBlocks.REACTOR_COOLER.get())) + .where('*', a -> a.getState().is(CNBlocks.REACTOR_CONTROLLER.get())) + .where('O', a -> a.getState().is(CNBlocks.REACTOR_CASING.get())) .build() ); } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/MultiblockHelpers.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/MultiblockHelpers.java index 08e05d1..f168e39 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/MultiblockHelpers.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/MultiblockHelpers.java @@ -1,13 +1,13 @@ package net.nuclearteam.createnuclear.content.multiblock; -import net.minecraft.core.BlockPos; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.level.Level; import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; import net.nuclearteam.createnuclear.content.multiblock.pattern.ReactorPattern; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancementBehaviour; +import org.jetbrains.annotations.Nullable; -import javax.annotation.Nullable; import java.util.function.BiConsumer; public class MultiblockHelpers { @@ -19,9 +19,7 @@ public class MultiblockHelpers { * invoke provided callbacks to register or remove parts. */ public static void handleOnPlace(BlockPos pos, Level level, BiConsumer register) { - handleOnPlace(pos, level, true); - - BlockPos controllerPos = pattern.findControllerPos(pos, level); + BlockPos controllerPos = pattern.findControllerPos(pos, level, true); if (controllerPos != null) { ReactorControllerBlockEntity controllerBlockEntity = (ReactorControllerBlockEntity) level.getBlockEntity(controllerPos); if (controllerBlockEntity != null) { @@ -30,18 +28,8 @@ public static void handleOnPlace(BlockPos pos, Level level, BiConsumer remover) { - handleOnPlace(pos, level, false); - - BlockPos controllerPos = pattern.findControllerPos(pos, level); + BlockPos controllerPos = pattern.findControllerPos(pos, level, false); if (controllerPos != null) { ReactorControllerBlockEntity controllerBlockEntity = (ReactorControllerBlockEntity) level.getBlockEntity(controllerPos); if (controllerBlockEntity != null) { diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/ReactorAssembler.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/ReactorAssembler.java index 38bb598..a591c5f 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/ReactorAssembler.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/ReactorAssembler.java @@ -3,13 +3,14 @@ import net.createmod.catnip.lang.LangBuilder; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; -import net.minecraft.world.entity.player.Player; +import net.minecraft.core.Direction; +import net.minecraft.sounds.SoundSource; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.AABB; +import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.nuclearteam.createnuclear.CNBlocks; -import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.CNSoundEvents; import net.nuclearteam.createnuclear.api.multiblock.BlockPattern; import net.nuclearteam.createnuclear.api.multiblock.TypeMultiblock; import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; @@ -20,6 +21,7 @@ import net.nuclearteam.createnuclear.foundation.utility.NotifyUtil; import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; +import java.util.ArrayList; import java.util.List; public final class ReactorAssembler { @@ -30,16 +32,25 @@ public final class ReactorAssembler { private ReactorAssembler() {} public static void assemble(BlockPos pos, Level level) { + if (level.isClientSide) return; + ReactorControllerBlockEntity entity = getBlockEntity(level, pos); if (entity == null) return; BlockPattern result = CNMultiblock.REGISTRATE_MULTIBLOCK.findStructure(level, pos, entity); if (result == null) return; - CreateNuclear.LOGGER.warn("ReactorAssembler#assemble id: {}, size: {}, name: {}", - result.id(), result.data().getSize(), result.data().getName()); + // Captured before setAssembled(true) below: assemble() is also reached from + // ReactorPattern.findControllerPos on an already-assembled reactor, and only the + // actual not-assembled -> assembled transition should notify and play the cue. + boolean wasAssembled = entity.isAssembled(); + + sendMessageToPlayer(level, pos, CreateNuclearLang.translate("notification.reactor.assembled"), !wasAssembled); - sendMessageToPlayer(level, pos, CreateNuclearLang.translate("notification.reactor.assembled"), !entity.isAssembled()); + if (!wasAssembled) { + // Server-side (null player) so the one-shot broadcasts to nearby clients. + level.playSound(null, pos, CNSoundEvents.MOTOR_ASSEMBLE.getMainEvent(), SoundSource.BLOCKS, 1.0f, 1.0f); + } switch (result.data()) { case REACTOR_T1 -> entity.getAdvancement().awardPlayer(CNAdvancement.T1_REACTOR); @@ -49,12 +60,14 @@ public static void assemble(BlockPos pos, Level level) { entity.setMultiblockSize(result.data().getSize()); entity.setAssembled(true); - entity.setMultiblockStructure(entity.getStructureBounds(pos, entity.getMultiblockSize(), entity.getMultiblockFacing())); + entity.setMultiblockStructure(ReactorAssembler.getStructureBound(pos, entity.getMultiblockSize(), entity.getMultiblockFacing())); findAndRegisterSpecialBlocks(entity.getMultiblockPos(), entity, level); } public static void disassemble(BlockPos pos, Level level) { + if (level.isClientSide) return; + ReactorControllerBlockEntity entity = getBlockEntity(level, pos); if (entity == null || !entity.isAssembled()) return; @@ -63,19 +76,23 @@ public static void disassemble(BlockPos pos, Level level) { sendMessageToPlayer(level, pos, CreateNuclearLang.translate("notification.reactor.disassembled"), true); + // Both early returns above already guarantee this is a real assembled -> broken + // transition, so no extra guard is needed here. + level.playSound(null, pos, CNSoundEvents.MOTOR_DISASSEMBLE.getMainEvent(), SoundSource.BLOCKS, 1.0f, 1.0f); + entity.setAssembled(false); entity.removeIOAll(); } - public static void findAndRegisterSpecialBlocks(int[] reactorPos, ReactorControllerBlockEntity entity, Level level) { - int xMin = reactorPos[0], xMax = reactorPos[1]; - int yMin = reactorPos[2], yMax = reactorPos[3]; - int zMin = reactorPos[4], zMax = reactorPos[5]; + public static void findAndRegisterSpecialBlocks(BoundingBox reactorPos, ReactorControllerBlockEntity entity, Level level) { + int xMin = reactorPos.minX(), xMax = reactorPos.maxX(); + int yMin = reactorPos.minY(), yMax = reactorPos.maxY(); + int zMin = reactorPos.minZ(), zMax = reactorPos.maxZ(); final Block reactorOutputBlock = CNBlocks.REACTOR_OUTPUT.get(); - final Block reactorInputBlock = CNBlocks.REACTOR_ROD_INPUT.get(); + final Block reactorRodInputBlock = CNBlocks.REACTOR_ROD_INPUT.get(); final Block reactorInputFluidBlock = CNBlocks.REACTOR_FLUID_INPUT.get(); - //final Block reactorAlarmBlock = CNBlocks.REACTOR_ALARM.get(); + final Block reactorAlarmBlock = CNBlocks.REACTOR_ALARM.get(); final Block reactorFrameBlock = CNBlocks.REACTOR_FRAME.get(); BlockPos.MutableBlockPos mutablePos = new BlockPos.MutableBlockPos(); @@ -83,6 +100,10 @@ public static void findAndRegisterSpecialBlocks(int[] reactorPos, ReactorControl int frameMinY = Integer.MAX_VALUE; int frameMaxY = Integer.MIN_VALUE; + // Collected here and assigned their capacity after the scan: the reactor-size capacity is a + // single TOTAL shared across every fluid input, so we split it once we know how many there are. + List fluidInputs = new ArrayList<>(); + for (int y = yMin; y <= yMax; y++) { boolean isYBoundary = (y == yMin || y == yMax); for (int x = xMin; x <= xMax; x++) { @@ -97,15 +118,15 @@ public static void findAndRegisterSpecialBlocks(int[] reactorPos, ReactorControl if (blockState.is(reactorOutputBlock)) { entity.addOutput(mutablePos.immutable()); - } else if (blockState.is(reactorInputBlock)) { + } else if (blockState.is(reactorRodInputBlock)) { entity.addInput(mutablePos.immutable()); } else if (blockState.is(reactorInputFluidBlock)) { entity.addInputFluid(mutablePos.immutable()); if (level.getBlockEntity(mutablePos) instanceof ReactorFluidInputEntity fluidInput) { - fluidInput.applyReactorTierCapacity(entity.getMultiblockSize()); + fluidInputs.add(fluidInput); } - //} else if (blockState.is(reactorAlarmBlock)) { - // entity.addAlarm(mutablePos.immutable()); + } else if (blockState.is(reactorAlarmBlock)) { + entity.addAlarm(mutablePos.immutable()); } else if (blockState.is(reactorFrameBlock)) { if (level.getBlockEntity(mutablePos) instanceof ReactorFrameEntity frame) { frame.setController(entity.getBlockPos()); @@ -118,7 +139,27 @@ public static void findAndRegisterSpecialBlocks(int[] reactorPos, ReactorControl } if (frameMinY != Integer.MAX_VALUE) { - entity.setFrameColumn(frameMinY, frameMaxY); + entity.getFrameDisplayManager().setFrameColumn(frameMinY, frameMaxY, entity::notifyUpdate); + } + + distributeFluidInputCapacity(fluidInputs, entity.getMultiblockSize()); + } + + /** + * Splits the reactor-size total fluid capacity evenly across all fluid inputs so the combined + * max capacity always equals the configured value, regardless of how many inputs were placed. + * The integer remainder is spread one unit at a time over the first inputs so the sum stays exact. + */ + private static void distributeFluidInputCapacity(List fluidInputs, int reactorSize) { + int count = fluidInputs.size(); + if (count == 0) return; + + int total = ReactorFluidInputEntity.getCapacityForReactorSize(reactorSize); + int base = total / count; + int remainder = total % count; + + for (int i = 0; i < count; i++) { + fluidInputs.get(i).applyCapacity(base + (i < remainder ? 1 : 0)); } } @@ -129,12 +170,6 @@ private static ReactorControllerBlockEntity getBlockEntity(Level level, BlockPos return null; } - @Deprecated - private static List getPlayersInRadius(Level level, BlockPos center, double radius) { - AABB box = new AABB(center).inflate(radius); - return level.getEntitiesOfClass(Player.class, box); - } - private static void sendMessageToPlayer(Level level, BlockPos pos, LangBuilder component, boolean condition) { if (!condition) return; @@ -143,4 +178,22 @@ private static void sendMessageToPlayer(Level level, BlockPos pos, LangBuilder c ChatFormatting.GOLD, configRadius, configWarnAll ); } + + public static BoundingBox getStructureBound(BlockPos center, int size, Direction facing) { + int radius = (size - 1) / 2; + int height = radius + 1; + int depth = size - 1; + Direction into = facing.getOpposite(); + + int axisX = into.getStepX() * depth; + int axisZ = into.getStepZ() * depth; + + int minX = center.getX() + Math.min(0, axisX) - (axisX == 0 ? radius : 0); + int maxX = center.getX() + Math.max(0, axisX) + (axisX == 0 ? radius : 0); + int minZ = center.getZ() + Math.min(0, axisZ) - (axisZ == 0 ? radius : 0); + int maxZ = center.getZ() + Math.max(0, axisZ) + (axisZ == 0 ? radius : 0); + + return new BoundingBox(minX, center.getY() - height, minZ, + maxX, center.getY() + height, maxZ); + } } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/casing/ReactorCasing.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/casing/ReactorCasing.java index 460a1b1..57331ed 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/casing/ReactorCasing.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/casing/ReactorCasing.java @@ -4,36 +4,35 @@ import com.simibubi.create.foundation.block.IBE; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; -import net.minecraft.core.Vec3i; import net.minecraft.network.chat.Component; import net.minecraft.util.StringRepresentable; 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.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.nuclearteam.createnuclear.CNBlockEntityTypes; import net.nuclearteam.createnuclear.CNBlocks; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlock; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; import net.nuclearteam.createnuclear.content.multiblock.input.item.ReactorRodInput; +import net.nuclearteam.createnuclear.content.multiblock.pattern.ReactorPattern; import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; -import java.util.List; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault @SuppressWarnings({"deprecation", "unused"}) public class ReactorCasing extends Block implements IWrenchable, IBE { private final TypeBlock typeBlock; + protected ReactorPattern pattern = new ReactorPattern(); public ReactorCasing(Properties properties, TypeBlock tBlock) { super(properties); @@ -44,22 +43,20 @@ public ReactorCasing(Properties properties, TypeBlock tBlock) { @Override // Called when the block is placed on the world public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { super.onPlace(state, level, pos, oldState, movedByPiston); - List players = level.players(); - FindController(pos, level, players, true); + // change nearby chunks' biomes to the mod biome (radius in blocks) + pattern.findController(pos, level, true); } - @Override // called when the player destroys the block, with or without a tool - public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool) { - super.playerDestroy(level, player, pos, state, blockEntity, tool); - List players = level.players(); - FindController(pos, level, players, false); + @Override + public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity pPlacer, ItemStack stack) { + super.setPlacedBy(level, pos, state, pPlacer, stack); + MultiblockHelpers.handleAdvancedPlacedBy(pos, level, pPlacer); } @Override public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { super.onRemove(state, level, pos, newState, movedByPiston); - List players = level.players(); - FindController(pos, level, players, false); + pattern.findController(pos, level, false); } @Override @@ -75,28 +72,6 @@ public InteractionResult onWrenched(BlockState state, UseOnContext context) { return InteractionResult.SUCCESS; } - // En attendant le controller pour verifier le pattern - public ReactorControllerBlock FindController(BlockPos blockPos, Level level, List players, boolean first){ // Function that checks the surrounding blocks in order - BlockPos newBlock; // to find the controller and verify the pattern - Vec3i pos = new Vec3i(blockPos.getX(), blockPos.getY(), blockPos.getZ()); - for (int y = pos.getY()-3; y != pos.getY()+4; y+=1) { - for (int x = pos.getX()-5; x != pos.getX()+5; x+=1) { - for (int z = pos.getZ()-5; z != pos.getZ()+5; z+=1) { - newBlock = new BlockPos(x, y, z); - if (level.getBlockState(newBlock).is(CNBlocks.REACTOR_CONTROLLER.get())) { // verifying the pattern - ReactorControllerBlock controller = (ReactorControllerBlock) level.getBlockState(newBlock).getBlock(); - controller.Verify(level.getBlockState(newBlock), newBlock, level, players, first); - ReactorControllerBlockEntity entity = controller.getBlockEntity(level, newBlock); - if (entity.created) { - return controller; - } - } - } - } - } - return null; - } - @Override public Class getBlockEntityClass() { return ReactorCasingEntity.class; diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlock.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlock.java index 8fb5bb6..78c92e6 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlock.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlock.java @@ -6,12 +6,16 @@ import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.ItemInteractionResult; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -22,14 +26,18 @@ import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.phys.BlockHitResult; import net.nuclearteam.createnuclear.*; -import net.nuclearteam.createnuclear.content.multiblock.CNMultiblock; -import net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutput; -import net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutputEntity; +import net.nuclearteam.createnuclear.content.multiblock.IHeat; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; +import net.nuclearteam.createnuclear.content.multiblock.ReactorAssembler; +import net.nuclearteam.createnuclear.content.multiblock.input.fluid.PersistentFluidLocks; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancement; import net.nuclearteam.createnuclear.foundation.block.HorizontalDirectionalReactorBlock; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; +import net.nuclearteam.createnuclear.foundation.utility.NotifyUtil; +import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; -import java.util.List; @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault @@ -45,6 +53,11 @@ public class ReactorControllerBlock extends HorizontalDirectionalReactorBlock im public ReactorControllerBlock(Properties properties) { super(properties); + this.registerDefaultState(this.stateDefinition.any() + .setValue(FACING, Direction.NORTH) + .setValue(ASSEMBLED, false) + .setValue(ACTIVE, false) // Inactive by default + ); } @Override @@ -60,10 +73,19 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { .setValue(ASSEMBLED, false) .setValue(ACTIVE, false); } + @Override public void neighborChanged(BlockState state, Level worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) { - withBlockEntityDo(worldIn, pos, be -> be.created = false); + if (worldIn.isClientSide) + return; + // A direct neighbor of the controller has changed. Do NOT blindly disassemble: + // only do so if the structure is actually broken. Otherwise, placing/replacing a + // block adjacent to the controller (frame above/below, input/alarm on the sides, + // cooler behind) would invalidate the assembly that was just validated. + // disassemble() checks findStructure and does nothing if the structure is complete. + if (state.getValue(ASSEMBLED)) + ReactorAssembler.disassemble(pos, worldIn); } @Override @@ -75,35 +97,50 @@ protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Lev if (!(blockEntity instanceof ReactorControllerBlockEntity controllerBlockEntity)) return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; ItemStack heldItem = player.getItemInHand(hand); + if (heldItem.is(Items.DEBUG_STICK)) { + withBlockEntityDo(level, pos, be -> be.logReactorConnections(player)); + } if (!state.getValue(ASSEMBLED)) { - player.sendSystemMessage(Component.translatable("reactor.info.assembled.none").withStyle(ChatFormatting.RED)); } else { - if (heldItem.is(CNItems.REACTOR_BLUEPRINT.get()) && controllerBlockEntity.inventory.getItem(0).isEmpty()){ + if (heldItem.is(CNItems.REACTOR_BLUEPRINT.get()) && controllerBlockEntity.getInventoryObject().getItem(0).isEmpty() + && heldItem.get(CNDataComponents.REACTOR_BLUE_PRINT_DATA) != null){ withBlockEntityDo(level, pos, be -> { - be.inventory.setStackInSlot(0, heldItem); - be.configuredPattern = heldItem; + be.getInventoryObject().setStackInSlot(0, heldItem); + be.setConfiguredPattern(heldItem); player.setItemInHand(hand, ItemStack.EMPTY); }); + // Inserting the blueprint is what starts energy production: this is the activation + // cue, not the multiblock assembly one (that lives in ReactorAssembler). + // One-shot played server-side (null player) so it broadcasts to nearby clients. + level.playSound(null, pos, CNSoundEvents.REACTOR_ACTIVATION.getMainEvent(), SoundSource.BLOCKS, 1.0f, 1.0f); return ItemInteractionResult.SUCCESS; } - else if (heldItem.isEmpty() && !controllerBlockEntity.inventory.getItem(0).isEmpty()) { + else if (heldItem.isEmpty() && !controllerBlockEntity.getInventoryObject().getItem(0).isEmpty()) { withBlockEntityDo(level, pos, be -> { - player.setItemInHand(hand, be.inventory.getItem(0)); - be.inventory.setStackInSlot(0, ItemStack.EMPTY); - be.configuredPattern = ItemStack.EMPTY; - be.total = 0.0; - be.rotate(be.getBlockState(), new BlockPos(be.getBlockPos().getX(), be.getBlockPos().getY() + (-3), be.getBlockPos().getZ()), be.getLevel(), 0, false); + ItemStack blueprint = be.getInventoryObject().getItem(0); + int storedHeat = Math.round(blueprint.getOrDefault(CNDataComponents.HEAT, 0f)); + if (IHeat.HeatLevel.of(storedHeat, be.getMultiblockSize()) == IHeat.HeatLevel.DANGER) { + be.getAdvancement().setPlayer(player.getUUID()); + be.getAdvancement().awardPlayer(CNAdvancement.NO_TIME_TO_DIE); + } + player.setItemInHand(hand, blueprint); + be.getInventoryObject().setStackInSlot(0, ItemStack.EMPTY); + be.setConfiguredPattern(ItemStack.EMPTY); + //be.clearTimers(); // uncomment if the timer should reset when the reactor stops + be.getOutputManager().rotateOutputs(be.getLevel(), be.getAssembled(), 0); be.notifyUpdate(); }); + // Blueprint removed: the multiblock stays assembled, it just stops producing. + level.playSound(null, pos, CNSoundEvents.REACTOR_SHUT_OFF.getMainEvent(), SoundSource.BLOCKS, 1.0f, 1.0f); state.setValue(ASSEMBLED, false); return ItemInteractionResult.SUCCESS; } - else if (!heldItem.isEmpty() && !controllerBlockEntity.inventory.getItem(0).isEmpty()) { + else if (!heldItem.isEmpty() && !controllerBlockEntity.getInventoryObject().getItem(0).isEmpty()) { return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; } } @@ -115,90 +152,42 @@ public void onRemove(BlockState state, Level worldIn, BlockPos pos, BlockState n if (!state.hasBlockEntity() || state.getBlock() == newState.getBlock()) return; - withBlockEntityDo(worldIn, pos, be -> ItemHelper.dropContents(worldIn, pos, be.inventory)); + withBlockEntityDo(worldIn, pos, be -> ItemHelper.dropContents(worldIn, pos, be.getInventoryObject())); worldIn.removeBlockEntity(pos); - ReactorControllerBlock controller = (ReactorControllerBlock) state.getBlock(); - - controller.Rotate(state, pos.below(3), worldIn, 0); - List players = worldIn.players(); - for (Player p : players) { - p.sendSystemMessage(Component.translatable("reactor.info.assembled.destroyer")); + if (worldIn instanceof ServerLevel serverLevel) { + PersistentFluidLocks.get(serverLevel).clearLock(pos); } + + if (!state.getValue(ASSEMBLED)) + return; + + int configRadius = CNConfigs.server().notify.warningDistance.get(); + boolean configWarnAll = CNConfigs.server().notify.warnAllPlayers.get(); + NotifyUtil.sendActionBar(worldIn, pos, + CreateNuclearLang.translate("notification.reactor.disassembled"), + ChatFormatting.GOLD, configRadius, configWarnAll + ); } @Override - public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { - super.onPlace(state, level, pos, oldState, movedByPiston); + public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity pPlacer, ItemStack stack) { + super.setPlacedBy(level, pos, state, pPlacer, stack); + MultiblockHelpers.handleAdvancedPlacedBy(pos, level, pPlacer); if (state.getValue(ASSEMBLED)) return; - List players = level.players(); - ReactorControllerBlock controller = (ReactorControllerBlock) state.getBlock(); - controller.Verify(state, pos, level, players, true); + ReactorAssembler.assemble(pos, level); } @Override public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool) { super.playerDestroy(level, player, pos, state, blockEntity, tool); - ReactorControllerBlock controller = (ReactorControllerBlock) state.getBlock(); - ReactorControllerBlockEntity entity = controller.getBlockEntity(level, pos); - if (!entity.created) - return; - controller.Rotate(state, pos.below(3), level, 0); - List players = level.players(); - for (Player p : players) { + if (!(blockEntity instanceof ReactorControllerBlockEntity entity)) return; + if (!entity.isAssembled()) return; + for (Player p : level.players()) { p.sendSystemMessage(Component.translatable("reactor.info.assembled.creator")); } - } - - // this is the Function that verifies if the pattern is correct (as a test, we added the energy output) - public void Verify(BlockState state, BlockPos pos, Level level, List players, boolean create){ - ReactorControllerBlock controller = (ReactorControllerBlock) level.getBlockState(pos).getBlock(); - ReactorControllerBlockEntity entity = controller.getBlockEntity(level, pos); - var result = CNMultiblock.REGISTRATE_MULTIBLOCK.findStructure(level, pos, this.getBlockEntity(level, pos)); // control the pattern - if (result != null) { // the pattern is correct - - for (Player player : players) { - if (create && !entity.created) { - player.sendSystemMessage(Component.translatable("reactor.info.assembled.creator")); - level.setBlockAndUpdate(pos, state.setValue(ASSEMBLED, true)); - entity.created = true; - entity.destroyed = false; - } - } - return; - } - - // the pattern is incorrect - for (Player player : players) { - if (!create && !entity.destroyed) - { - player.sendSystemMessage(Component.translatable("reactor.info.assembled.destroyer")); - level.setBlockAndUpdate(pos, state.setValue(ASSEMBLED, false)); - entity.created = false; - entity.destroyed = true; - Rotate(state, pos.below(3), level, 0); - } - } - } - public void Rotate(BlockState state, BlockPos pos, Level level, int rotation) { - if (level.getBlockState(pos).is(CNBlocks.REACTOR_OUTPUT.get())) { - ReactorOutput block = (ReactorOutput) level.getBlockState(pos).getBlock(); - ReactorOutputEntity entity = block.getBlockEntityType().getBlockEntity(level, pos); - - if (state.getValue(ASSEMBLED) && rotation != 0) { // Starting the energy - entity.speed = rotation; - entity.setSpeed(Math.abs(entity.speed)); - } else { // stopping the energy - - entity.setSpeed(0); - entity.speed = 0; - } - entity.updateSpeed = true; - entity.updateGeneratedRotation(); - - entity.setSpeed(rotation); - } +// entity.removeIOAll(); } @Override @@ -210,5 +199,4 @@ public Class getBlockEntityClass() { public BlockEntityType getBlockEntityType() { return CNBlockEntityTypes.REACTOR_CONTROLLER.get(); } - } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlockEntity.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlockEntity.java index 680c4c2..c1ebcf9 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlockEntity.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlockEntity.java @@ -1,141 +1,85 @@ package net.nuclearteam.createnuclear.content.multiblock.controller; import com.simibubi.create.api.equipment.goggles.IHaveGoggleInformation; -import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.foundation.utility.IInteractionChecker; -import lib.multiblock.SimpleMultiBlockAislePatternBuilder; -import net.createmod.catnip.platform.CatnipServices; -import net.minecraft.ChatFormatting; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.HolderLookup; +import net.minecraft.client.Minecraft; +import net.minecraft.core.*; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.item.Item; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.level.material.Fluid; -import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.fluids.FluidStack; -import net.neoforged.neoforge.fluids.capability.IFluidHandler; import net.neoforged.neoforge.items.IItemHandler; -import net.neoforged.neoforge.items.wrapper.EmptyItemHandler; -import net.nuclearteam.createnuclear.*; + +import net.nuclearteam.createnuclear.CNDataComponents; +import net.nuclearteam.createnuclear.CNSoundEvents; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.api.multiblock.IMultiblockController; import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; -import net.nuclearteam.createnuclear.content.multiblock.CNMultiblock; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorDisplayState; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorGoggleTooltipRenderer; +import net.nuclearteam.createnuclear.content.multiblock.controller.service.*; +import net.nuclearteam.createnuclear.content.multiblock.controller.snapshot.ReactorInputSnapshot; +import net.nuclearteam.createnuclear.content.multiblock.controller.snapshot.ReactorInputSnapshotBuilder; import net.nuclearteam.createnuclear.content.multiblock.IHeat; -import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.PatternData; -import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintData; -import net.nuclearteam.createnuclear.content.multiblock.controller.manager.*; -import net.nuclearteam.createnuclear.content.multiblock.input.fluid.FluidLockManager; -import net.nuclearteam.createnuclear.content.multiblock.input.fluid.PersistentFluidLocks; -import net.nuclearteam.createnuclear.content.multiblock.input.fluid.ReactorFluidInputEntity; -import net.nuclearteam.createnuclear.content.multiblock.input.item.ReactorRodInputEntity; -import net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutput; -import net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutputEntity; -import net.nuclearteam.createnuclear.content.multiblock.pattern.ReactorPattern; +import net.nuclearteam.createnuclear.content.multiblock.reactorLogic.HeatBalance; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancement; import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancementBehaviour; +import net.nuclearteam.createnuclear.content.multiblock.controller.consumable.ConsumptionCycleManager; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import static net.nuclearteam.createnuclear.content.multiblock.CNMultiblock.*; +import net.nuclearteam.createnuclear.content.multiblock.input.fluid.PersistentFluidLocks; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.*; +import net.nuclearteam.createnuclear.content.multiblock.pattern.ReactorPattern; +import net.nuclearteam.createnuclear.content.multiblock.reactorLogic.HeatManager; + import static net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlock.ASSEMBLED; -@SuppressWarnings({"unused"}) -public class ReactorControllerBlockEntity extends SmartBlockEntity implements IInteractionChecker, IHaveGoggleInformation { - public boolean destroyed = false; - public boolean created = false; - public boolean test = true; - public int speed = 16; // This is the result speed of the reactor, change this to change the total capacity - - public boolean sendUpdate; - - public ReactorControllerBlock controller; - - public ReactorControllerInventory inventory; - - - //private boolean powered; - public State powered = State.OFF; - public float reactorPower; - public float lastReactorPower; - int overFlowHeatTimer = 0; - int overFlowLimiter = 30; - double overHeat = 0; - public int baseUraniumHeat = 25; - public int baseGraphiteHeat = -10; - public int proximityUraniumHeat = 5; - public int proximityGraphiteHeat = -5; - public int maxUraniumPerGraphite = 3; - public int graphiteTimer = 3600; - public int uraniumTimer = 3600; - public int tmpGraphiteTimer = graphiteTimer; - public int tmpUraniumTimer = uraniumTimer; - public int countUraniumRod; - public int countGraphiteRod; - public int heat; - public double total; - private boolean isTotal = false; - public CompoundTag screen_pattern = new CompoundTag(); - public ItemStack configuredPattern; - - private ItemStack fuelItem; - private ItemStack coolerItem; - - private final int[][] formattedPattern = new int[][]{ - {99,99,99,0,1,2,99,99,99}, - {99,99,3,4,5,6,7,99,99}, - {99,8,9,10,11,12,13,14,99}, - {15,16,17,18,19,20,21,22,23}, - {24,25,26,27,28,29,30,31,32}, - {33,34,35,36,37,38,39,40,41}, - {99,42,43,44,45,46,47,48,99}, - {99,99,49,50,51,52,53,99,99}, - {99,99,99,54,55,56,99,99,99} - }; - private final int[][] offsets = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} }; - - /* - FORGE ARGUMENTS PART +@SuppressWarnings({ "unused" }) +public class ReactorControllerBlockEntity extends SmartBlockEntity + implements IInteractionChecker, IHaveGoggleInformation, IMultiblockController { + /** + * The assembled state is stored in the block state + * (`ReactorControllerBlock.ASSEMBLED`). + * Use the helper accessors below to query or toggle it to keep + * entity/blockstate consistent. */ - private final ReactorPattern pattern = new ReactorPattern(); - private int explosionCountdown = 0; + private final ReactorControllerInventory inventory; + private int countFuelRod; + private int countCoolerRod; + private HeatBalance heatBalance; + private int heat; + private int lastAppliedOutputHeat; private boolean isExploding = false; - //private final ConsumptionCycleManager cycleManager = new ConsumptionCycleManager(); + /** Client-only looping "running" sound instance; never accessed server-side. */ + @OnlyIn(Dist.CLIENT) + private ReactorRunningSoundInstance runningSound; + + private final ConsumptionCycleManager cycleManager = new ConsumptionCycleManager(); private double liquidLife; + private ItemStack configuredPattern; - private BigItemStack bigFuelItem; - private BigItemStack bigCoolerItem; private List bigFluidStack; private int reactorSize = 0; - private String reactorFacing = "null"; + private Direction reactorFacing = null; // les pos sont [xMin, xMax, yMin, yMax, zMin, zMax] - private int[] reactorPos; - // Vertical span (block Y) of the reactor frame columns, used to map the - // fluid fill ratio onto the liquid actually drawn in the frame windows. - private int frameColumnMinY = Integer.MAX_VALUE; - private int frameColumnMaxY = Integer.MIN_VALUE; - // Per-tick cache for the fluid drawn in the frame windows. Recomputed from the - // live (synced) input tanks so the displayed fluid and its fill ratio always - // come from the same source and stay consistent for every fluid type. - private long frameFluidCacheTick = -1; - private FluidStack frameFluidCache = FluidStack.EMPTY; - private float frameFluidFillRatioCache = 0f; + private BoundingBox reactorPos; + + private boolean needsToResolveEntities = false; private double fluidBuffer = 0.0; @@ -145,15 +89,20 @@ public class ReactorControllerBlockEntity extends SmartBlockEntity implements II private final ReactorOutputManagerI outputManager; private final ReactorInputFluidManagerI inputFluidManager; private final ReactorAlarmManagerI alarmManager; + private final ReactorFrameDisplayManagerI frameDisplayManager; - // Client Display Data (Synced via NBT) - private Map clientDisplayItems = new HashMap<>(); - private List clientDisplayFluids = new ArrayList<>(); - private long clientMaxFluidCapacity = 0; + private ReactorDisplayState displayState = ReactorDisplayState.EMPTY; // services (dependencies) - abstracted behind interfaces to follow DIP - //private final IHeatService heatService; - //private final IPersistenceService persistenceService; + private final IHeatService heatService; + private final IPersistenceService persistenceService; + private final IExplosionService meltdownExecutor; + private final IReactorHeatUpdateCoordinator heatCoordinator; + private final IFluidConsumptionRateCalculator fluidRateCalculator; + /** Counts down to the next explosion once in danger; keeps the original 1-tick lag against the heat recalculated later this tick. */ + private final IReactorMeltdownMonitor meltdownMonitor; + /** Drives the alarm blocks based on the danger flag; built in {@link #addBehaviours} since it depends on {@link #advancement}. */ + private IReactorAlarmCoordinator alarmCoordinator; // service fields are injected; implementations live in separate classes @@ -162,13 +111,13 @@ public ReactorControllerInventory getInventoryObject() { return this.inventory; } - /*public void deserializeInventory(CompoundTag tag) { - this.inventory.deserializeNBT(tag); + public void deserializeInventory(HolderLookup.Provider registries, CompoundTag tag) { + this.inventory.deserializeNBT(registries, tag); } - public CompoundTag serializeInventory() { - return this.inventory.serializeNBT(); - }*/ + public CompoundTag serializeInventory(HolderLookup.Provider registries) { + return this.inventory.serializeNBT(registries); + } public ItemStack getConfiguredPattern() { return this.configuredPattern; @@ -178,28 +127,21 @@ public void setConfiguredPattern(ItemStack stack) { this.configuredPattern = stack; } - public CompoundTag getConfiguredPatternTag() { - return this.configuredPattern.getOrDefault(net.minecraft.core.component.DataComponents.CUSTOM_DATA, net.minecraft.world.item.component.CustomData.EMPTY).copyTag(); - } - - public int[] getMultiblockPos() { - return this.reactorPos; - } - - public BigItemStack getBigFuelItem() { - return this.bigFuelItem; - } - - public void setBigFuelItem(BigItemStack b) { - this.bigFuelItem = b; - } - - public BigItemStack getBigCoolerItem() { - return this.bigCoolerItem; + /** + * Current heat stored on the blueprint stack. + *

+ * Replaces the Forge {@code getConfiguredPatternTag().getDouble("heat")}: the value now + * lives in the {@link CNDataComponents#HEAT} data component, because reading the stack's + * NBT tag back on NeoForge yields a defensive copy. + */ + public int getConfiguredPatternHeat() { + if (this.configuredPattern.isEmpty()) return 0; + return Math.round(this.configuredPattern.getOrDefault(CNDataComponents.HEAT, 0f)); } - public void setBigCoolerItem(BigItemStack b) { - this.bigCoolerItem = b; + /** @return the first loaded fluid, or {@code null} if no fluid is present. */ + private BigFluidStack currentFluidStack() { + return bigFluidStack.isEmpty() ? null : bigFluidStack.get(0); } public List getBigFluidStack() { @@ -210,96 +152,63 @@ public void setBigFluidStack(List b) { this.bigFluidStack = b; } - private void refreshFrameFluidCache() { - if (level == null) return; - long now = level.getGameTime(); - if (now == frameFluidCacheTick) return; - frameFluidCacheTick = now; - - long amount = 0; - long capacity = 0; - FluidStack fluid = FluidStack.EMPTY; - for (IFluidHandler handler : inputFluidManager.getFuildHandlers(level)) { - int tanks = handler.getTanks(); - for (int t = 0; t < tanks; t++) { - FluidStack stack = handler.getFluidInTank(t); - capacity += handler.getTankCapacity(t); - amount += stack.getAmount(); - if (fluid.isEmpty() && !stack.isEmpty()) fluid = stack.copy(); - } - } - - frameFluidCache = fluid; - frameFluidFillRatioCache = capacity > 0 ? Math.min(1f, (float) amount / (float) capacity) : 0f; - } - - public FluidStack getDisplayedFluid() { - refreshFrameFluidCache(); - return frameFluidCache; + public int getMultiblockSize() { + return this.reactorSize; } - /** - * How full the reactor's fluid input is, in the range {@code [0, 1]}, used by - * the frame renderer to size the visible liquid column. - */ - public float getDisplayedFluidFillRatio() { - refreshFrameFluidCache(); - return frameFluidFillRatioCache; + public void setMultiblockSize(int s) { + this.reactorSize = s; } - /** Records the lowest and highest frame block-Y of the assembled reactor. */ - public void setFrameColumn(int minY, int maxY) { - if (this.frameColumnMinY == minY && this.frameColumnMaxY == maxY) return; - this.frameColumnMinY = minY; - this.frameColumnMaxY = maxY; - notifyUpdate(); + @Override + public Direction getMultiblockFacing() { + return this.reactorFacing; } - /** @return the lowest frame block-Y, or {@link Integer#MAX_VALUE} if unknown. */ - public int getFrameColumnMinY() { - return frameColumnMinY; + @Override + public void setMultiblockFacing(Direction f) { + this.reactorFacing = f; } - /** @return the highest frame block-Y, or {@link Integer#MIN_VALUE} if unknown. */ - public int getFrameColumnMaxY() { - return frameColumnMaxY; + public CNAdvancementBehaviour getAdvancement() { + return this.advancement; } - public boolean hasFrameColumn() { - return frameColumnMinY != Integer.MAX_VALUE && frameColumnMaxY != Integer.MIN_VALUE - && frameColumnMaxY >= frameColumnMinY; + /** Main constructor allowing dependency injection for testability and DIP compliance. */ + public BoundingBox getMultiblockPos() { + return this.reactorPos; } - public int getMultiblockSize() { - return this.reactorSize; + public void setMultiblockStructure(BoundingBox p) { + this.reactorPos = p; } - public void setMultiblockSize(int s) { - this.reactorSize = s; + public void clearTimers() { + this.cycleManager.clear(); } - public String getMultiblockFacing() { - return this.reactorFacing; + public ReactorFrameDisplayManagerI getFrameDisplayManager() { + return this.frameDisplayManager; } - public void setMultiblockFacing(String f) { - this.reactorFacing = f; + public ReactorInputFluidManagerI getInputFluidManager() { + return this.inputFluidManager; } - public CNAdvancementBehaviour getAdvancement() { - return this.advancement; + public ReactorOutputManagerI getOutputManager() { + return this.outputManager; } - public void setMultiblockStructure(int[] p) { - this.reactorPos = p; + public void setDisplayState(ReactorDisplayState state) { + this.displayState = state; } - public double getLiquidLife() { - return this.liquidLife; + public ReactorDisplayState getDisplayState() { + return this.displayState; } - public void setLiquidLife(double l) { - this.liquidLife = l; + private List allManagers() { + return List.of(inputManager, inputFluidManager, outputManager, alarmManager); } /** @@ -310,95 +219,79 @@ public ReactorControllerBlockEntity(BlockEntityType type, BlockPos pos, Block super(type, pos, state); this.inventory = new ReactorControllerInventory(this); this.configuredPattern = ItemStack.EMPTY; + this.heatBalance = new HeatBalance(0, 0); this.inputManager = new ReactorInputManager(); this.outputManager = new ReactorOutputManager(); this.inputFluidManager = new ReactorInputFluidManager(); this.alarmManager = new ReactorAlarmManager(); + this.frameDisplayManager = new ReactorFrameDisplayManager(); - this.bigFuelItem = new BigItemStack(ItemStack.EMPTY); - this.bigCoolerItem = new BigItemStack(ItemStack.EMPTY); this.bigFluidStack = new ArrayList<>(); - //this.heatService = new DefaultHeatService(new HeatManager()); - //this.persistenceService = new DefaultPersistenceService(); + this.heatService = new DefaultHeatService(new HeatManager()); + this.persistenceService = new DefaultPersistenceService(); + this.meltdownExecutor = new ReactorMeltdownExecutor(); + this.heatCoordinator = new ReactorHeatUpdateCoordinator(this.heatService); + this.fluidRateCalculator = new FluidConsumptionRateCalculator(this.heatService); + this.meltdownMonitor = new ReactorMeltdownMonitor(); } @Override public void addBehaviours(List behaviours) { - + behaviours.add(advancement = new CNAdvancementBehaviour(this, CNAdvancement.T1_REACTOR, CNAdvancement.T2_REACTOR, CNAdvancement.T3_REACTOR, CNAdvancement.NO_TIME_TO_DIE, CNAdvancement.SILENCE_THE_CORE)); + this.alarmCoordinator = new ReactorAlarmCoordinator(advancement); } - public boolean getAssembled() { // permet de savoir si le réacteur est formé ou pas. + public boolean getAssembled() { // returns whether the reactor structure is currently assembled BlockState state = getBlockState(); return state.getValue(ASSEMBLED); } @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { - if(!configuredPattern.isEmpty()) { - CreateLang.translate("gui.gauge.info_header").style(ChatFormatting.GRAY).forGoggles(tooltip); - IHeat.HeatLevel.getName("reactor_controller").style(ChatFormatting.GRAY).forGoggles(tooltip); - - IHeat.HeatLevel.getFormattedHeatText(heat, getMultiblockSize()).forGoggles(tooltip); - - if (fuelItem.isEmpty()) { - // if rod empty we initialize it at 1 (and display it as 0) to avoid having air item displayed instead of the rod - IHeat.HeatLevel.getFormattedItemText(new ItemStack(CNItems.URANIUM_ROD.asItem(), 1), true, level).forGoggles(tooltip); - } else { - IHeat.HeatLevel.getFormattedItemText(fuelItem, false, level).forGoggles(tooltip); - } - - if (fuelItem.isEmpty()) { - // if rod empty we initialize it at 1 (and display it as 0) to avoid having air item displayed instead of the rod - IHeat.HeatLevel.getFormattedItemText(new ItemStack(CNItems.GRAPHITE_ROD.asItem(), 1), true, level).forGoggles(tooltip); - } else { - IHeat.HeatLevel.getFormattedItemText(coolerItem, false, level).forGoggles(tooltip); - } + if (configuredPattern.isEmpty() || configuredPattern.get(CNDataComponents.REACTOR_BLUE_PRINT_DATA) == null) { + return false; } + ReactorGoggleTooltipRenderer.render(tooltip, displayState, getConfiguredPatternHeat(), isPlayerSneaking, reactorSize); + return true; } - //(Si les methode read et write ne sont pas implémenté alors lorsque l'on relance le monde minecraft les items dans le composant auront disparu !) + // (If read/write are not implemented, the items stored in this block entity's + // inventory will be lost when the world is reloaded!) @Override - protected void read(CompoundTag tag, HolderLookup.Provider registries, boolean clientPacket) { //Permet de stocker les item 1/2 - if (!clientPacket) { - inventory.deserializeNBT(registries, tag.getCompound("inventory")); - } - configuredPattern = ItemStack.EMPTY; - if (tag.contains("configuredPattern")) { - ItemStack.parse(registries, tag.getCompound("configuredPattern")).ifPresent(i -> configuredPattern = i); - } - - coolerItem = ItemStack.EMPTY; - if (tag.contains("coolerItem")) { - ItemStack.parse(registries, tag.getCompound("coolerItem")).ifPresent(i -> coolerItem = i); + protected void read(CompoundTag compound, HolderLookup.Provider registries, boolean clientPacket) { + super.read(compound, registries, clientPacket); // Always call first to restore the base coordinates + // delegate managers and persistence + this.inputManager.read(compound); + this.outputManager.read(compound); + this.inputFluidManager.read(compound); + this.alarmManager.read(compound); + this.frameDisplayManager.read(compound); + + this.persistenceService.readBasicState(this, compound, registries, clientPacket); + this.needsToResolveEntities = true; + + this.cycleManager.clear(); + if (compound.contains("cycleManager")) { + this.cycleManager.deserializeNBT(compound.getCompound("cycleManager")); } - - fuelItem = ItemStack.EMPTY; - if (tag.contains("fuelItem")) { - ItemStack.parse(registries, tag.getCompound("fuelItem")).ifPresent(i -> fuelItem = i); - } - - total = tag.getDouble("total"); - heat = tag.getInt("heat"); - super.read(tag, registries, clientPacket); } @Override - protected void write(CompoundTag compound, HolderLookup.Provider registries, boolean clientPacket) { //Permet de stocker les item 2/2 - if (!clientPacket) { - compound.put("inventory", inventory.serializeNBT(registries)); - } + protected void write(CompoundTag compound, HolderLookup.Provider registries, boolean clientPacket) { + super.write(compound, registries, clientPacket); + this.inputManager.write(compound); + this.outputManager.write(compound); + this.inputFluidManager.write(compound); + this.alarmManager.write(compound); + this.frameDisplayManager.write(compound); - if (configuredPattern != null) compound.put("configuredPattern", configuredPattern.saveOptional(registries)); - if (coolerItem != null) compound.put("coolerItem", coolerItem.saveOptional(registries)); - if (fuelItem != null) compound.put("fuelItem", fuelItem.saveOptional(registries)); + this.persistenceService.writeBasicState(this, compound, registries, clientPacket); - compound.putDouble("total", Double.isNaN(total) ? total : calculateProgress()); - compound.putInt("heat", heat); - super.write(compound, registries, clientPacket); + compound.put("cycleManager", cycleManager.serializeNBT()); } public boolean isAssembled() { @@ -418,338 +311,160 @@ public void setAssembled(boolean assembled) { this.setChanged(); } - public enum State { - ON, OFF + public void logReactorConnections(Player player) { + ReactorDebugDiagnostics.sendReactorConnectionsTo(player, level, inputManager, inputFluidManager, outputManager, alarmManager); + } + + private void updateReactorStateVisibility() { + if (level == null || level.isClientSide) return; + + BlockState state = getBlockState(); + if (!(state.getBlock() instanceof ReactorControllerBlock)) return; + + boolean currentActive = state.getValue(ReactorControllerBlock.ACTIVE); + + // The reactor is "ACTIVE" (ON) only if it is assembled AND has the resources required to run + boolean targetActive = isAssembled() && heatCoordinator.canRun(getConfiguredPattern(), getDisplayState(), getInputFluidManager(), level, getAssembled()); + + if (currentActive != targetActive) { + level.setBlock(worldPosition, state.setValue(ReactorControllerBlock.ACTIVE, targetActive), 3); + } } @Override public void tick() { super.tick(); - if (level.isClientSide) + if (level.isClientSide) { + tickRunningSound(); + return; + } + if (isExploding) return; + // Heat value written by the previous tick's handleAssembledState(); this tick's recalculated + // heat is not visible here yet, so the alarm/meltdown danger flag is intentionally 1 tick behind. + int currentHeat = getConfiguredPatternHeat(); + boolean isDanger = alarmCoordinator.computeDanger(currentHeat, this.getMultiblockSize()); - if (isEmptyConfiguredPattern()) { - ReactorBluePrintData data = getReactorBluePrintData(); - countGraphiteRod = data.countGraphiteRod(); - countUraniumRod = data.countUraniumRod(); + alarmCoordinator.update(level, alarmManager, isDanger); + + IReactorMeltdownMonitor.MeltdownState meltdownState = meltdownMonitor.tick(level, getBlockPos(), isDanger); + + if (meltdownState == IReactorMeltdownMonitor.MeltdownState.EXPLODE) { + if (level instanceof ServerLevel serverLevel) { + this.meltdownExecutor.triggerExplosion(serverLevel, getBlockPos(), reactorSize, countFuelRod); - if (!isTotal) { - total = calculateProgress(); - isTotal = true; - } - BlockEntity blockEntity = level.getBlockEntity(getBlockPosForReactor('I')); - - if (blockEntity instanceof ReactorRodInputEntity be) { - fuelItem = be.inventory.getStackInSlot(0); - coolerItem = be.inventory.getStackInSlot(1); - - IItemHandler capability = level.getCapability(Capabilities.ItemHandler.BLOCK, be.getBlockPos(), Direction.NORTH.getOpposite()); - if (capability == null) - capability = EmptyItemHandler.INSTANCE; - if (tmpUraniumTimer >= 0) { - tmpUraniumTimer -= 1 * countUraniumRod; - } else { - ItemStack extractItem1 = capability.extractItem(0, 1, false); - tmpUraniumTimer = uraniumTimer; - } - if (tmpGraphiteTimer >= 0) { - tmpGraphiteTimer -= 1 * countGraphiteRod; - } else { - ItemStack extractItem2 = capability.extractItem(1, 1, false); - tmpGraphiteTimer = graphiteTimer; - } - - if (!fuelItem.isEmpty() && !coolerItem.isEmpty()) { - heat = (int) calculateHeat(inventory.getItem(0)); - if (updateTimers()) { - - IHeat.HeatLevel currentLevel = IHeat.HeatLevel.of(heat, getMultiblockSize()); - if (currentLevel == IHeat.HeatLevel.SAFETY || currentLevel == IHeat.HeatLevel.CAUTION || currentLevel == IHeat.HeatLevel.WARNING) { - this.rotate(getBlockState(), new BlockPos(getBlockPos().getX(), getBlockPos().getY() + FindController('O').getY(), getBlockPos().getZ()), getLevel(), heat/4, true); - return; - } else { - EventTriggerPacket packet = new EventTriggerPacket(600); - CreateNuclear.LOGGER.warn("hum EventTriggerBlock ? {}", packet); - CatnipServices.NETWORK.sendToClientsAround((ServerLevel) level, getBlockPos(), 32, packet); - - this.rotate(getBlockState(), new BlockPos(getBlockPos().getX(), getBlockPos().getY() + FindController('O').getY(), getBlockPos().getZ()), getLevel(), 0, false); - isTotal = false; - return; - } - } else { - this.rotate(getBlockState(), new BlockPos(getBlockPos().getX(), getBlockPos().getY() + FindController('O').getY(), getBlockPos().getZ()), getLevel(), 0, false); - isTotal = false; - return; - } - } - this.notifyUpdate(); } + isExploding = true; + return; } - } - private boolean isEmptyConfiguredPattern() { - return !configuredPattern.isEmpty();// || !configuredPattern.getOrCreateTag().isEmpty(); - } + if (!isEmptyConfiguredPattern()) { + // Deliberately a local, shadowing the field, exactly as on Forge: the field `heat` + // must keep the value handleAssembledState() computed, and is only refreshed there. + int heat = getConfiguredPatternHeat(); + countCoolerRod = getConfiguredPatternCoolerRodCount(); + countFuelRod = getConfiguredPatternFuelRodCount(); + heatBalance = heatCoordinator.calculateHeatBalance(configuredPattern, displayState, level); + } + resolveEntitiesIfNeeded(); - private boolean updateTimers() { - total -= 1; - return total >= 0;//(total/constTotal) >= 0; - } + ReactorInputSnapshot snapshot = ReactorInputSnapshotBuilder.build(level, inputManager, inputFluidManager); + this.displayState = new ReactorDisplayState(snapshot.items(), snapshot.fluids(), snapshot.maxFluidCapacity()); + this.bigFluidStack = snapshot.fluids(); - private ReactorBluePrintData getDefaultReactorBluePrintData() { - return new ReactorBluePrintData( - 0, 0, 0, 0, - new PatternData[0], new PatternData[0] - ); - } - private ReactorBluePrintData getReactorBluePrintData() { - return configuredPattern.getOrDefault(CNDataComponents.REACTOR_BLUE_PRINT_DATA, getDefaultReactorBluePrintData()); + updateReactorStateVisibility(); + handleAssembledState(); } - private double calculateProgress() { - ReactorBluePrintData data = getReactorBluePrintData(); - countGraphiteRod = data.countGraphiteRod(); - countUraniumRod = data.countUraniumRod(); - graphiteTimer = data.graphiteTime(); - uraniumTimer = data.uraniumTime(); - - double progressGraphite = countGraphiteRod > 0 - ? (double) graphiteTimer / countGraphiteRod - : 0.0; - double progressUranium = countUraniumRod > 0 - ? (double) uraniumTimer / countUraniumRod - : 0.0; - - double tmp = progressGraphite + progressUranium; - - return progressGraphite + progressUranium; + /** + * Rod counts required by the configured pattern. + *

+ * Forge reads {@code countCoolerRod}/{@code countFuelRod} off the blueprint's NBT tag; + * on NeoForge they live in the {@code ReactorBluePrintData} component written by + * {@code ReactorBluePrintMenu#saveData}. + */ + private int getConfiguredPatternCoolerRodCount() { + var data = configuredPattern.get(CNDataComponents.REACTOR_BLUE_PRINT_DATA); + return data == null ? 0 : data.countGraphiteRod(); } - private double calculateHeat(ItemStack input) { - ReactorBluePrintData data = input.getOrDefault(CNDataComponents.REACTOR_BLUE_PRINT_DATA, getDefaultReactorBluePrintData()); + private int getConfiguredPatternFuelRodCount() { + var data = configuredPattern.get(CNDataComponents.REACTOR_BLUE_PRINT_DATA); + return data == null ? 0 : data.countUraniumRod(); + } - countGraphiteRod = data.countGraphiteRod(); - countUraniumRod = data.countUraniumRod(); - heat = 0; + /** + * Client-side: keep the looping "running" sound alive while the reactor is producing energy. + * Driven by the {@code ACTIVE} blockstate property, which the server recomputes every tick in + * {@link #updateReactorStateVisibility()} and vanilla syncs to the client automatically. + */ + @OnlyIn(Dist.CLIENT) + private void tickRunningSound() { + BlockState state = getBlockState(); + boolean active = state.hasProperty(ReactorControllerBlock.ACTIVE) + && state.getValue(ReactorControllerBlock.ACTIVE); - // if more than maxUraniumPerGraphite of the rods are uranium, the reactor will overheat - if (countUraniumRod > countGraphiteRod * maxUraniumPerGraphite) { - overFlowHeatTimer++; - if (overFlowHeatTimer >= overFlowLimiter) { - overHeat++; - overFlowHeatTimer = 0; - if (overFlowLimiter > 2) { - overFlowLimiter--; - } + if (!active) { + if (runningSound != null) { + runningSound.stopSound(); + runningSound = null; } - } else { - overFlowHeatTimer = 0; - overFlowLimiter = 30; - overHeat = Math.max(0, overHeat - 2); + return; } - PatternData[] patternDataAll = data.patternAll(); - for (PatternData pd : patternDataAll) { - char currentRod = '\0'; - ItemStack stack = pd.stack(); - - if (stack.is(CNItems.URANIUM_ROD)) { - heat += baseUraniumHeat; - currentRod = 'u'; - } else if (stack.is(CNItems.GRAPHITE_ROD)) { - heat += baseGraphiteHeat; - currentRod = 'g'; - } - - if (currentRod != '\0') { - pattern: - for (int i = 0; i < formattedPattern.length; i++) { - for (int j = 0; j < formattedPattern[i].length; j++) { - if (formattedPattern[i][j] == pd.slot()) { - // the offsets for the four directions (down, up, right, left) is int[][] offsets = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} }; (defined at the top of the class) - for (int[] offset : offsets) { - int ni = i + offset[0], nj = j + offset[1]; - if (ni < 0 || ni >= formattedPattern.length || nj < 0 || nj >= formattedPattern[i].length) continue; - - int neighborSlot = formattedPattern[ni][nj]; - for (PatternData pd2 : patternDataAll) { - if (pd2.slot() == neighborSlot) { - ItemStack stack2 = pd.stack(); - if (currentRod == 'u') { - heat += stack2.is(CNItems.URANIUM_ROD) ? proximityUraniumHeat : proximityGraphiteHeat; - } - break; - } - } - } - break pattern; - } - } - } - } + if (runningSound == null || runningSound.isStopped()) { + runningSound = new ReactorRunningSoundInstance(level, worldPosition, CNSoundEvents.REACTOR_RUNNING.getMainEvent()); + Minecraft.getInstance().getSoundManager().play(runningSound); } - - return heat + overHeat; } - private BlockPos getBlockPosForReactor(char character) { - BlockPos pos = FindController(character); - BlockPos posController = getBlockPos(); - BlockPos posInput = new BlockPos(posController.getX(), posController.getY(), posController.getZ()); - - int[][] directions = { - {0,0, pos.getX()}, // NORTH - {0,0, -pos.getX()}, // SOUTH - {-pos.getX(),0,0}, // EAST - {pos.getX(),0,0} // WEST - }; - + // --- extracted sub-steps to keep single responsibility per method --- + private void resolveEntitiesIfNeeded() { + if (!needsToResolveEntities) + return; + List handlers = inputManager.getItemHandlers(level); + CreateNuclear.LOGGER.warn("Resolving inputs after load, handlers found: {}", handlers.size()); + needsToResolveEntities = false; + this.setChanged(); + } - for (int[] direction : directions) { - BlockPos newPos = posController.offset(direction[0], direction[1], direction[2]); - if (level.getBlockState(newPos).is(CNBlocks.REACTOR_ROD_INPUT.get())) { - posInput = newPos; - break; + /** + * Tick logic applied while the reactor is assembled: if it doesn't have + * enough fuel ({@link IReactorHeatUpdateCoordinator#canRun}), only the + * displayed heat is updated (and outputs stopped); otherwise the actual + * heat is calculated, fluid consumed, the item consumption cycle advanced, + * and outputs rotated according to the heat. + */ + private void handleAssembledState() { + if (!heatCoordinator.canRun(configuredPattern, displayState, inputFluidManager, level, isAssembled())) { + heatCoordinator.updateHeatOnly(configuredPattern, displayState, currentFluidStack(), heatBalance, heat, inventory, level, isAssembled()); + if (!outputManager.getBlocksPosition(getLevel()).isEmpty()) { + outputManager.rotateOutputs(getLevel(), getAssembled(), 0); } + + setChanged(); + notifyUpdate(); + return; } - return posInput; - } - - private CompoundTag convertePattern(CompoundTag compoundTag) { - ListTag pattern = compoundTag.getList("Items", Tag.TAG_COMPOUND); - - int[][] list = new int[][]{ - {99,99,99,0,1,2,99,99,99}, - {99,99,3,4,5,6,7,99,99}, - {99,8,9,10,11,12,13,14,99}, - {15,16,17,18,19,20,21,22,23}, - {24,25,26,27,28,29,30,31,32}, - {33,34,35,36,37,38,39,40,41}, - {99,42,43,44,45,46,47,48,99}, - {99,99,49,50,51,52,53,99,99}, - {99,99,99,54,55,56,99,99,99} - }; - - - return null; - } - - private static BlockPos FindController(char character) { - return SimpleMultiBlockAislePatternBuilder.start() - .aisle(AAAAA, AAAAA, AAAAA, AAAAA, AAAAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AAIAA, ADADA, BACAB, ADADA, AAAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AAAAA, AAAAA, AAAAA, AAAAA, AAOAA) - .where('A', a -> a.getState().is(CNBlocks.REACTOR_CASING.get())) - .where('B', a -> a.getState().is(CNBlocks.REACTOR_FRAME.get())) - .where('C', a -> a.getState().is(CNBlocks.REACTOR_CORE.get())) - .where('D', a -> a.getState().is(CNBlocks.REACTOR_COOLER.get())) - .where('*', a -> a.getState().is(CNBlocks.REACTOR_CONTROLLER.get())) - .where('O', a -> a.getState().is(CNBlocks.REACTOR_OUTPUT.get())) - .where('I', a -> a.getState().is(CNBlocks.REACTOR_ROD_INPUT.get())) - .getDistanceController(character); - } - - public void rotate(BlockState state, BlockPos pos, Level level, int rotation, boolean isActif) { - rotation = rotation > 0 ? rotation : heat/4; - if (level.getBlockState(pos).is(CNBlocks.REACTOR_OUTPUT.get()) && rotation > 0 && isActif) { - if (level.getBlockState(pos).getBlock() instanceof ReactorOutput block) { - ReactorOutputEntity entity = block.getBlockEntityType().getBlockEntity(level, pos); - if (state.getValue(ASSEMBLED)) { // Starting the energy - entity.speed = rotation; - entity.heat = rotation; - } else { // stopping the energy - entity.speed = 0; - entity.heat = 0; - } - entity.updateSpeed = true; - entity.updateGeneratedRotation(); - entity.setSpeed(rotation); + setChanged(); + notifyUpdate(); - } - } - else { - if (level.getBlockState(pos).getBlock() instanceof ReactorOutput block) { - ReactorOutputEntity entity = block.getBlockEntityType().getBlockEntity(level, pos); - entity.setSpeed(0); - entity.heat = 0; - entity.updateSpeed = true; - entity.updateGeneratedRotation(); - } - } - } + BigFluidStack fluidStack = currentFluidStack(); + heat = heatCoordinator.calculateAndWriteHeat(configuredPattern, fluidStack, heatBalance, heat, inventory, level, displayState); + fluidBuffer = fluidRateCalculator.tick(fluidStack, reactorSize, level, inputFluidManager, fluidBuffer); + cycleManager.update(configuredPattern, level, inputManager, level.getGameTime() % 20 == 0); - @Deprecated - public int[] getStructureBounds(BlockPos startPos, int structureSize, String facing) { - int[] northOffsets5x5 = new int[] { -2, 2, -3, 3, 0, 4 }; - int[] northOffsets7x7 = new int[] { -3, 3, -4, 4, 0, 6 }; - int[] northOffsets9x9 = new int[] { -4, 4, -5, 5, 0, 8 }; - - int[] eastOffsets5x5 = new int[] { -4, 0, -3, 3, -2, 2 }; - int[] eastOffsets7x7 = new int[] { -6, 0, -4, 4, -3, 3 }; - int[] eastOffsets9x9 = new int[] { -8, 0, -5, 5, -4, 4 }; - - int[] southOffsets5x5 = new int[] { -2, 2, -3, 3, -4, 0 }; - int[] southOffsets7x7 = new int[] { -3, 3, -4, 4, -6, 0 }; - int[] southOffsets9x9 = new int[] { -4, 4, -5, 5, -8, 0 }; - - int[] westOffsets5x5 = new int[] { 0, 4, -3, 3, -2, 2 }; - int[] westOffsets7x7 = new int[] { 0, 6, -4, 4, -3, 3 }; - int[] westOffsets9x9 = new int[] { 0, 8, -5, 5, -4, 4 }; - - switch (facing) { - case "north": - switch (structureSize) { - case 5: - return applyOffset(startPos, northOffsets5x5); - case 7: - return applyOffset(startPos, northOffsets7x7); - case 9: - return applyOffset(startPos, northOffsets9x9); - } - case "east": - switch (structureSize) { - case 5: - return applyOffset(startPos, eastOffsets5x5); - case 7: - return applyOffset(startPos, eastOffsets7x7); - case 9: - return applyOffset(startPos, eastOffsets9x9); - } - case "south": - switch (structureSize) { - case 5: - return applyOffset(startPos, southOffsets5x5); - case 7: - return applyOffset(startPos, southOffsets7x7); - case 9: - return applyOffset(startPos, southOffsets9x9); - } - case "west": - switch (structureSize) { - case 5: - return applyOffset(startPos, westOffsets5x5); - case 7: - return applyOffset(startPos, westOffsets7x7); - case 9: - return applyOffset(startPos, westOffsets9x9); - } - default: - return new int[] { 0, 0, 0, 0, 0, 0 }; + if (IHeat.HeatLevel.isNotDanger(heat, getMultiblockSize()) && !outputManager.getBlocksPosition(level).isEmpty()) { + if (Math.abs(heat - lastAppliedOutputHeat) >= ReactorOutputManager.RPM_DIVIDER / 2) { + lastAppliedOutputHeat = heat; + } + outputManager.rotateOutputs(getLevel(), getAssembled(), lastAppliedOutputHeat); } } - @Deprecated - private int[] applyOffset(BlockPos pos, int[] offset) { - int x = pos.getX(); - int y = pos.getY(); - int z = pos.getZ(); - - return new int[] { x + offset[0], x + offset[1], y + offset[2], y + offset[3], z + offset[4], z + offset[5] }; + private boolean isEmptyConfiguredPattern() { + return configuredPattern.isEmpty() || configuredPattern.get(CNDataComponents.REACTOR_BLUE_PRINT_DATA) == null; } public void addInput(BlockPos inputPos) { @@ -780,6 +495,10 @@ public void addInputFluid(BlockPos outputPos) { public void removeInputFluid(BlockPos outputPos) { this.inputFluidManager.removeBlock(outputPos); this.setChanged(); + // Breaking a fluid input discards its tank contents along with the block entity. + // Re-evaluate the fluid lock so a different fluid can be accepted once no remaining + // input still holds liquid — otherwise the controller stays locked to the old fluid. + clearLockIfAllInputsEmpty(); } public void addAlarm(BlockPos alarmPos) { @@ -793,77 +512,52 @@ public void removeAlarm(BlockPos alarmPos) { } public void removeIOAll() { - this.inputManager.clearInvalid(level); - this.outputManager.clearInvalid(level); - this.inputFluidManager.clearInvalid(level); - this.alarmManager.clearInvalid(level); + allManagers().forEach(m -> m.clearInvalid(level)); this.setChanged(); } /** Try to lock this controller to the given Fluid. Returns true if allowed. */ public boolean tryLockFluid(Fluid fluid) { - // server-persistent approach (preferred): use PersistentFluidLocks when on - // server - if (level != null && !level.isClientSide && level instanceof ServerLevel serverLevel) { + // Fluid locks are server-authoritative and persisted per-level via PersistentFluidLocks. + // On the client there is no lock to enforce, so stay permissive. + if (level instanceof ServerLevel serverLevel) { return PersistentFluidLocks.get(serverLevel).tryLock(getBlockPos(), fluid); } - // fallback to in-memory manager (single-server-run) - return FluidLockManager.tryLock(getBlockPos(), fluid); + return true; } /** Returns whether the given FluidStack is acceptable for this controller. */ public boolean canAcceptFluid(FluidStack stack) { if (stack == null || stack.isEmpty()) return true; - if (level != null && !level.isClientSide && level instanceof ServerLevel serverLevel) { + if (level instanceof ServerLevel serverLevel) { return PersistentFluidLocks.get(serverLevel).canAccept(getBlockPos(), stack.getFluid()); } - return FluidLockManager.canAccept(getBlockPos(), stack); + return true; } /** Force-clear the lock on this controller. */ public void clearLock() { - if (level != null && !level.isClientSide && level instanceof ServerLevel serverLevel) { + if (level instanceof ServerLevel serverLevel) { PersistentFluidLocks.get(serverLevel).clearLock(getBlockPos()); - } else { - FluidLockManager.clearLock(getBlockPos()); + setChanged(); + sendData(); } - setChanged(); - sendData(); } public void clearLockIfAllInputsEmpty() { if (level == null || level.isClientSide) return; - final int SCAN_RADIUS = CNMultiblock.REGISTRATE_MULTIBLOCK.findStructure(level, getBlockPos(), this).data() - .getSize(); // adapte selon la taille max du multiblock - BlockPos center = getBlockPos(); - boolean anyNonEmpty = false; - - for (int dx = -SCAN_RADIUS; dx <= SCAN_RADIUS && !anyNonEmpty; dx++) { - for (int dy = -SCAN_RADIUS; dy <= SCAN_RADIUS && !anyNonEmpty; dy++) { - for (int dz = -SCAN_RADIUS; dz <= SCAN_RADIUS && !anyNonEmpty; dz++) { - BlockPos p = center.offset(dx, dy, dz); - BlockEntity be = level.getBlockEntity(p); - if (!(be instanceof ReactorFluidInputEntity)) - continue; - - IFluidHandler handler = level.getCapability(Capabilities.FluidHandler.BLOCK, p, null); - if (handler == null) - continue; - - for (int t = 0; t < handler.getTanks(); t++) { - if (!handler.getFluidInTank(t).isEmpty()) { - anyNonEmpty = true; - break; - } - } - } - } - } + boolean anyNonEmpty = getInputFluidManager().getFuildHandlers(level).stream() + .anyMatch(handler -> { + for (int t = 0; t < handler.getTanks(); t++) + if (!handler.getFluidInTank(t).isEmpty()) + return true; + return false; + }); if (!anyNonEmpty) clearLock(); } -} \ No newline at end of file +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorOutputManager.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorOutputManager.java index 34e9f03..cb6616a 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorOutputManager.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorOutputManager.java @@ -5,19 +5,19 @@ import net.minecraft.nbt.ListTag; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; +import net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutput; import net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutputEntity; import java.util.ArrayList; import java.util.List; -import java.util.function.BiFunction; /** * Manager for a reactor's outputs (`ReactorOutput`). - * Handles serialization of output positions and distribution - * of energy via `distributeSU`. + * Handles serialization of output positions. */ public class ReactorOutputManager extends AbstractReactorIOManager implements ReactorOutputManagerI { private static final String NBT_KEY = "ReactorOutputs"; + public static final int RPM_DIVIDER = 32; @Override public void write(CompoundTag compound) { @@ -42,79 +42,10 @@ public void read(CompoundTag compound) { } /** - * Example usage: - * double totalSUToDistribute = this.reactorPower; // or another value depending on logic - * if (!reactorOutputEntityList.isEmpty() && totalSUToDistribute > 0) { - * double remaining = outputManager.distributeSU(totalSUToDistribute, reactorOutputEntityList, (outEntity, amount) -> { - * // Inserter: apply `amount` to the output and return the amount not accepted. - * // Here we accept everything and apply the corresponding speed (rounded) - * int speed = (int) Math.round(amount); - * try { - * outEntity.setSpeed(speed); - * outEntity.heat = speed; // adjust heat if needed - * outEntity.updateSpeed = true; - * outEntity.updateGeneratedRotation(); - * return 0.0; // all accepted - * } catch (Exception e) { - * return amount; // nothing accepted on error - * } - * }); - * // `remaining` contains the SU that couldn't be inserted — you can store or drop it - * this.reactorPower = (float) remaining; // example: keep the remainder - * } - * @param totalSU total SU to distribute - * @param level world level (may be null) - * @param inserter function that applies an amount to an output and returns not accepted amount - * @return amount of SU not inserted + * {@inheritDoc} + * A tracked position is dropped if its chunk isn't loaded or the block + * entity at that position is no longer a {@link ReactorOutputEntity}. */ - public double distributeSU(double totalSU, Level level, BiFunction inserter) { - if (totalSU <= 0 || inserter == null) return totalSU; - List validOutputs = new ArrayList<>(); - for (BlockPos p : new ArrayList<>(positions)) { - if (level == null || !level.isLoaded(p)) continue; - BlockEntity be = level.getBlockEntity(p); - if (be instanceof ReactorOutputEntity out) validOutputs.add(out); - } - if (validOutputs.isEmpty()) return totalSU; - - double remaining = totalSU; - List active = new ArrayList<>(validOutputs); - final double MIN_ACCEPTED_SU = 1e-6; - - // Distribute evenly and reallocate the remainder among outputs still able to accept - boolean progress = true; - while (remaining > MIN_ACCEPTED_SU && !active.isEmpty() && progress) { - progress = false; - double share = remaining / active.size(); - List stillActive = new ArrayList<>(); - - for (ReactorOutputEntity out : active) { - double toInsert = share; - double notAccepted; - try { - notAccepted = inserter.apply(out, toInsert); - } catch (Exception e) { - notAccepted = toInsert; - } - if (Double.isNaN(notAccepted) || notAccepted < 0) notAccepted = 0; - if (notAccepted > toInsert) notAccepted = toInsert; - double inserted = toInsert - notAccepted; - - if (inserted > MIN_ACCEPTED_SU) { - progress = true; - remaining -= inserted; - // keep this output active; it may accept more in the next round - stillActive.add(out); - } - // if inserted == 0, remove it (do not attempt to send more) - } - - active = stillActive; - } - - return remaining; - } - @Override public void clearInvalid(Level level) { List toRemove = new ArrayList<>(); @@ -129,6 +60,11 @@ public void clearInvalid(Level level) { positions.removeAll(toRemove); } + /** + * {@inheritDoc} + * Filters the tracked positions down to those currently backed by a + * loaded {@link ReactorOutputEntity}. + */ @Override public List getBlocksPosition(Level level) { List positions = new ArrayList<>(); @@ -138,4 +74,41 @@ public List getBlocksPosition(Level level) { } return List.copyOf(positions); } + + /** + * {@inheritDoc} + * The total rotation (in RPM, divided down by {@link #RPM_DIVIDER}) is + * split as evenly as possible across the tracked outputs, with the + * remainder distributed to the first outputs. Each output is set to its + * share of the rotation speed if the reactor is assembled, otherwise + * stopped. + */ + @Override + public void rotateOutputs(Level level, boolean assembled, int rotation) { + if (positions.isEmpty()) return; + + int totalRpm = rotation / RPM_DIVIDER; + int size = positions.size(); + int remainingRotation = totalRpm % size; + + for (int i = 0; i < size; i++) { + int dividedRotation = (totalRpm / size) + (i < remainingRotation ? 1 : 0); + BlockPos pos = positions.get(i); + + if (!(level.getBlockState(pos).getBlock() instanceof ReactorOutput block)) continue; + ReactorOutputEntity entity = block.getBlockEntityType().getBlockEntity(level, pos); + if (entity == null) continue; + + if (dividedRotation > 0) { + entity.speed = assembled ? dividedRotation : 0; + entity.updateSpeed = true; + entity.setSpeedAndUpdate(dividedRotation); + entity.updateGeneratedRotation(); + } else { + entity.setSpeedAndUpdate(0); + entity.updateSpeed = true; + entity.updateGeneratedRotation(); + } + } + } } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorOutputManagerI.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorOutputManagerI.java index 45ef40a..ddc8b4b 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorOutputManagerI.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorOutputManagerI.java @@ -2,26 +2,19 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; -import net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutputEntity; import java.util.List; -import java.util.function.BiFunction; /** * Interface exposing operations specific to reactor outputs. - * The main responsibility is to distribute an amount of energy (SU) - * among valid outputs and use an `inserter` to apply quantities to each - * `ReactorOutputEntity`. */ public interface ReactorOutputManagerI extends ReactorIOManager { - /** - * Distributes `totalSU` among valid outputs in `level`. - * The `inserter` receives the target entity and the proposed amount and - * must return the amount not accepted (>= 0). - * Returns the remaining amount that was not inserted. - */ - double distributeSU(double totalSU, Level level, BiFunction inserter); - /** Returns an immutable copy of tracked positions. */ List getBlocksPosition(Level level); + + /** + * Distributes the total rotation across the tracked outputs and applies + * the corresponding speed/stop to each {@code ReactorOutputEntity}. + */ + void rotateOutputs(Level level, boolean assembled, int rotation); } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/DefaultPersistenceService.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/DefaultPersistenceService.java new file mode 100644 index 0000000..106672a --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/DefaultPersistenceService.java @@ -0,0 +1,51 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorDisplayState; + +public class DefaultPersistenceService implements IPersistenceService { + @Override + public void readBasicState(ReactorControllerBlockEntity owner, CompoundTag compound, HolderLookup.Provider registries, boolean clientPacket) { + owner.setMultiblockSize(compound.getInt("reactorSize")); + owner.setMultiblockFacing(Direction.byName(compound.getString("reactorFacing"))); + + owner.setMultiblockStructure(compound.contains("reactorPose") + ? BoundingBox.CODEC.parse(NbtOps.INSTANCE, compound.get("reactorPose")).result().orElse(null) + : null + ); + + if (!clientPacket) { + owner.deserializeInventory(registries, compound.getCompound("pattern")); + } else { + owner.setDisplayState(compound.contains("displayState") + ? ReactorDisplayState.deserializeNBT(registries, compound.getCompound("displayState")) + : ReactorDisplayState.EMPTY + ); + } + owner.setConfiguredPattern(ItemStack.parse(registries, compound.getCompound("items")).orElse(ItemStack.EMPTY)); + + } + + @Override + public void writeBasicState(ReactorControllerBlockEntity owner, CompoundTag compound, HolderLookup.Provider registries, boolean clientPacket) { + compound.putInt("reactorSize", owner.getMultiblockSize()); + compound.putString("reactorFacing", owner.getMultiblockFacing() != null ? owner.getMultiblockFacing().getSerializedName() : ""); + if (owner.getMultiblockPos() != null) { + compound.put("reactorPose", BoundingBox.CODEC.encodeStart(NbtOps.INSTANCE, owner.getMultiblockPos()).getOrThrow()); + } + + if (!clientPacket) { + compound.put("pattern", owner.serializeInventory(registries)); + } else { + compound.put("displayState", owner.getDisplayState().serializeNBT(registries)); + } + compound.put("items", owner.getConfiguredPattern().saveOptional(registries)); + + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IPersistenceService.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IPersistenceService.java new file mode 100644 index 0000000..c43f400 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IPersistenceService.java @@ -0,0 +1,18 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; + +/** + * Reads and writes the controller's own state (multiblock size/facing/bounds, + * blueprint stack, and either the inventory or the client display snapshot). + *

+ * Both methods take a {@link HolderLookup.Provider} on top of the Forge + * signature: from 1.21 onwards, serializing an {@code ItemStack} or a + * {@code FluidStack} requires registry access. + */ +public interface IPersistenceService { + void readBasicState(ReactorControllerBlockEntity owner, CompoundTag compound, HolderLookup.Provider registries, boolean clientPacket); + void writeBasicState(ReactorControllerBlockEntity owner, CompoundTag compound, HolderLookup.Provider registries, boolean clientPacket); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/cooler/ReactorCooler.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/cooler/ReactorCooler.java index 2c66f9b..d046d12 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/cooler/ReactorCooler.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/cooler/ReactorCooler.java @@ -2,65 +2,38 @@ import com.simibubi.create.content.equipment.wrench.IWrenchable; import net.minecraft.core.BlockPos; -import net.minecraft.core.Vec3i; -import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; 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.nuclearteam.createnuclear.CNBlocks; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlock; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; +import net.nuclearteam.createnuclear.content.multiblock.pattern.ReactorPattern; import javax.annotation.Nullable; -import java.util.List; public class ReactorCooler extends Block implements IWrenchable { public ReactorCooler(Properties properties) { super(properties); } + protected ReactorPattern pattern = new ReactorPattern(); @Override // Called when the block is placed on the world public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { super.onPlace(state, level, pos, oldState, movedByPiston); - List players = level.players(); - FindController(pos, level, players, true); + pattern.findController(pos, level, true); } - @Override // called when the player destroys the block, with or without a tool - public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool) { - super.playerDestroy(level, player, pos, state, blockEntity, tool); - List players = level.players(); - FindController(pos, level, players, false); + @Override + public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity pPlacer, ItemStack stack) { + super.setPlacedBy(level, pos, state, pPlacer, stack); + MultiblockHelpers.handleAdvancedPlacedBy(pos, level, pPlacer); } @Override public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { super.onRemove(state, level, pos, newState, movedByPiston); - List players = level.players(); - FindController(pos, level, players, false); - } - - public ReactorControllerBlock FindController(BlockPos blockPos, Level level, List players, boolean first){ // Function that checks the surrounding blocks in order - BlockPos newBlock; // to find the controller and verify the pattern - Vec3i pos = new Vec3i(blockPos.getX(), blockPos.getY(), blockPos.getZ()); - for (int y = pos.getY()-3; y != pos.getY()+4; y+=1) { - for (int x = pos.getX()-5; x != pos.getX()+5; x+=1) { - for (int z = pos.getZ()-5; z != pos.getZ()+5; z+=1) { - newBlock = new BlockPos(x, y, z); - if (level.getBlockState(newBlock).is(CNBlocks.REACTOR_CONTROLLER.get())) { // verifying the pattern - ReactorControllerBlock controller = (ReactorControllerBlock) level.getBlockState(newBlock).getBlock(); - controller.Verify(level.getBlockState(newBlock), newBlock, level, players, first); - ReactorControllerBlockEntity entity = controller.getBlockEntity(level, newBlock); - if (entity.created) { - return controller; - } - } - } - } - } - return null; + pattern.findController(pos, level, false); } } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/core/ReactorCoreEntity.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/core/ReactorCoreEntity.java index acbaddb..9c38de1 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/core/ReactorCoreEntity.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/core/ReactorCoreEntity.java @@ -1,21 +1,15 @@ package net.nuclearteam.createnuclear.content.multiblock.core; -import lib.multiblock.SimpleMultiBlockAislePatternBuilder; import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.nuclearteam.createnuclear.CNBlocks; -import net.nuclearteam.createnuclear.content.multiblock.IHeat; import net.nuclearteam.createnuclear.content.multiblock.casing.ReactorCasingEntity; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; -import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; - -import static net.nuclearteam.createnuclear.content.multiblock.CNMultiblock.*; @SuppressWarnings({"unused"}) public class ReactorCoreEntity extends ReactorCasingEntity { + private int countdownTicks = 0; + private boolean hasExploded = false; public ReactorCoreEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); @@ -25,69 +19,6 @@ public ReactorCoreEntity(BlockEntityType type, BlockPos pos, BlockState state public void tick() { super.tick(); - if (level.isClientSide()) return; - - BlockPos controllerPos = getBlockPosForReactor(); - if (level.getBlockEntity(controllerPos) instanceof ReactorControllerBlockEntity reactorController) { - int heat = reactorController.heat; - if (IHeat.HeatLevel.of(heat, reactorController.getMultiblockSize()) == IHeat.HeatLevel.DANGER) { - if (countdownTicks >= CNConfigs.common().explode.time.get()) { // 300 ticks = 15 secondes - explodeReactorCore(level, getBlockPos()); - } else { - countdownTicks++; - } - } else { - countdownTicks = 0; // Reset the countdown if the heat level is not in danger - } - } - } - - private void explodeReactorCore(Level world, BlockPos pos) { - level.explode(null, pos.getX(), pos.getY(), pos.getZ(), 20F, Level.ExplosionInteraction.BLOCK); - } - - private static BlockPos FindController(char character) { - return SimpleMultiBlockAislePatternBuilder.start() - .aisle(AAAAA, AAAAA, AAAAA, AAAAA, AAAAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AAIAA, ADADA, BACAB, ADADA, AAAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AAAAA, AAAAA, AAAAA, AAAAA, AAOAA) - .where('A', a -> a.getState().is(CNBlocks.REACTOR_CASING.get())) - .where('B', a -> a.getState().is(CNBlocks.REACTOR_FRAME.get())) - .where('C', a -> a.getState().is(CNBlocks.REACTOR_CORE.get())) - .where('D', a -> a.getState().is(CNBlocks.REACTOR_COOLER.get())) - .where('*', a -> a.getState().is(CNBlocks.REACTOR_CONTROLLER.get())) - .where('O', a -> a.getState().is(CNBlocks.REACTOR_OUTPUT.get())) - .where('I', a -> a.getState().is(CNBlocks.REACTOR_ROD_INPUT.get())) - .getDistanceController(character); - } - - private BlockPos getBlockPosForReactor() { - BlockPos posController = getBlockPos(); - BlockPos posInput = new BlockPos(posController.getX(), posController.getY(), posController.getZ()); - - int[][][] directions = { - {{0, 2, 2}, {0, 1, 2}, {0, 0, 2}, {0, -1, 2}, {0, -2, 2}}, // NORTH - {{0, 2, -2}, {0, 1, -2}, {0, 0, -2}, {0, -1, -2}, {0, -2, -2}}, // SOUTH - - {{2, 2, 0}, {2, 1, 0}, {2, 0, 0}, {2, -1, 0}, {2, -2, 0}}, // EAST - {{-2, 2, 0}, {-2, 1, 0}, {-2, 0, 0}, {-2, -1, 0}, {-2, -2, 0}} // WEST - }; - - - for (int[][] direction : directions) { - for (int[] dir : direction) { - BlockPos newPos = posController.offset(dir[0], dir[1], dir[2]); - if (level.getBlockState(newPos).is(CNBlocks.REACTOR_CONTROLLER.get())) { - posInput = newPos; - break; - } - } - } - - return posInput; + if (level.isClientSide() || hasExploded) return; } } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrame.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrame.java index d9c1ad3..803ada5 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrame.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrame.java @@ -1,11 +1,11 @@ package net.nuclearteam.createnuclear.content.multiblock.frame; import com.simibubi.create.content.equipment.wrench.IWrenchable; +import com.simibubi.create.foundation.block.IBE; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.core.Vec3i; import net.minecraft.util.StringRepresentable; -import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; @@ -13,22 +13,21 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Mirror; import net.minecraft.world.level.block.Rotation; -import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.EnumProperty; import net.minecraft.world.level.block.state.properties.Property; -import net.nuclearteam.createnuclear.CNBlocks; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlock; +import net.nuclearteam.createnuclear.CNBlockEntityTypes; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; +import net.nuclearteam.createnuclear.content.multiblock.pattern.ReactorPattern; import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.List; - -public class ReactorFrame extends Block implements IWrenchable { +public class ReactorFrame extends Block implements IWrenchable, IBE { public static final Property PART = EnumProperty.create("part", Part.class); - + protected ReactorPattern pattern = new ReactorPattern(); public ReactorFrame(Properties properties) { super(properties); } @@ -108,32 +107,33 @@ public BlockState mirror(BlockState state, Mirror mirror) { @Override public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { super.onPlace(state, level, pos, oldState, movedByPiston); - List players = level.players(); - FindController(pos, level, players, true); + pattern.findController(pos, level, true); } - @Override // called when the player destroys the block, with or without a tool - public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool) { - super.playerDestroy(level, player, pos, state, blockEntity, tool); - List players = level.players(); - FindController(pos, level, players, false); + + @Override + public void setPlacedBy(Level level, BlockPos pos, BlockState state, @javax.annotation.Nullable LivingEntity pPlacer, ItemStack stack) { + super.setPlacedBy(level, pos, state, pPlacer, stack); + MultiblockHelpers.handleAdvancedPlacedBy(pos, level, pPlacer); } - public ReactorControllerBlock FindController(BlockPos blockPos, Level level, List players, boolean first){ // Function that checks the surrounding blocks in order - BlockPos newBlock; // to find the controller and verify the pattern - Vec3i pos = new Vec3i(blockPos.getX(), blockPos.getY(), blockPos.getZ()); - for (int y = pos.getY()-3; y != pos.getY()+4; y+=1) { - for (int x = pos.getX()-5; x != pos.getX()+5; x+=1) { - for (int z = pos.getZ()-5; z != pos.getZ()+5; z+=1) { - newBlock = new BlockPos(x, y, z); - if (level.getBlockState(newBlock).is(CNBlocks.REACTOR_CONTROLLER.get())) { // verifying the pattern - ReactorControllerBlock controller = (ReactorControllerBlock) level.getBlockState(newBlock).getBlock(); - controller.Verify(level.getBlockState(newBlock), newBlock, level, players, first); - return controller; - } - } - } + @Override + public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { + super.onRemove(state, level, pos, newState, movedByPiston); + // playerDestroy is NOT called in creative mode, so the structure must also be + // re-evaluated here. Only react to an actual block removal/replacement (different + // block type), not to a simple PART property change (same block, via setBlock). + if (!state.is(newState.getBlock())) { + pattern.findController(pos, level, false); } - return null; } + @Override + public Class getBlockEntityClass() { + return ReactorFrameEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return CNBlockEntityTypes.REACTOR_FRAME.get(); + } } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrameRenderer.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrameRenderer.java index 154340c..22cf929 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrameRenderer.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrameRenderer.java @@ -7,6 +7,7 @@ import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.neoforged.neoforge.fluids.FluidStack; import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorFrameDisplayManagerI; /** * Renders the reactor fluid dynamically inside the {@link ReactorFrame} window. @@ -30,7 +31,9 @@ protected void renderSafe(ReactorFrameEntity be, float partialTicks, PoseStack m ReactorControllerBlockEntity controller = be.getControllerEntity(); if (controller == null) return; - FluidStack fluid = controller.getDisplayedFluid(); + ReactorFrameDisplayManagerI frameDisplay = controller.getFrameDisplayManager(); + + FluidStack fluid = frameDisplay.getDisplayedFluid(controller.getLevel(), controller.getInputFluidManager()); if (fluid == null || fluid.isEmpty()) return; // Local vertical bounds of the liquid volume inside this block, matching @@ -51,10 +54,10 @@ protected void renderSafe(ReactorFrameEntity be, float partialTicks, PoseStack m // from the bottom frame's lip (frameMinY + 4/16) to the top frame's cap // (frameMaxY + 9/16), so even a nearly-empty reactor still shows a sliver. float yMax = boxYMax; - if (controller.hasFrameColumn()) { - float ratio = controller.getDisplayedFluidFillRatio(); - double liquidBottomWorldY = controller.getFrameColumnMinY() + 4.0 / 16.0; - double liquidTopWorldY = controller.getFrameColumnMaxY() + 9.0 / 16.0; + if (frameDisplay.hasFrameColumn()) { + float ratio = frameDisplay.getDisplayedFluidFillRatio(controller.getLevel(), controller.getInputFluidManager()); + double liquidBottomWorldY = frameDisplay.getFrameColumnMinY() + 4.0 / 16.0; + double liquidTopWorldY = frameDisplay.getFrameColumnMaxY() + 9.0 / 16.0; double surfaceWorldY = liquidBottomWorldY + ratio * (liquidTopWorldY - liquidBottomWorldY); double localSurface = surfaceWorldY - be.getBlockPos().getY(); if (localSurface <= boxYMin) return; // liquid level is below this block @@ -65,9 +68,8 @@ protected void renderSafe(ReactorFrameEntity be, float partialTicks, PoseStack m // it counts as "lighter than air" and would otherwise be flipped 180°, // hiding the top surface. We always fill bottom-to-top here. CatnipServices.FLUID_RENDERER.renderFluidBox( - fluid.getFluid().defaultFluidState(), // Conversion de FluidStack en FluidState + fluid.getFluid().defaultFluidState(), // 1.21 takes a FluidState, not a FluidStack X_MIN, boxYMin, Z_MIN, X_MAX, yMax, Z_MAX, - buffer, ms, light, false, false - ); + buffer, ms, light, false, false); } } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInputEntity.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInputEntity.java index 7f5ce31..462d6c0 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInputEntity.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInputEntity.java @@ -64,9 +64,15 @@ public static int getCapacityForReactorSize(int reactorSize) { }; } - /** Applique la capacité correspondant à la taille du réacteur à laquelle cet input appartient. */ - public void applyReactorTierCapacity(int reactorSize) { - int capacity = getCapacityForReactorSize(reactorSize); + /** + * Applies an explicit tank capacity to this input. + *

+ * The per-reactor-size capacity ({@link #getCapacityForReactorSize(int)}) is the TOTAL the + * reactor should hold, split across all fluid inputs by {@code ReactorAssembler}, so the sum + * of every input's capacity stays equal to the configured value no matter how many inputs the + * player places. + */ + public void applyCapacity(int capacity) { if (internalTank.getCapacity() == capacity) return; internalTank.setCapacity(capacity); if (level != null && !level.isClientSide) { diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInput.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInput.java index 3f0a4ec..50a297d 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInput.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInput.java @@ -4,9 +4,9 @@ import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.item.ItemHelper; import net.minecraft.core.BlockPos; -import net.minecraft.core.Vec3i; import net.minecraft.world.InteractionHand; import net.minecraft.world.ItemInteractionResult; + import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; @@ -15,26 +15,26 @@ import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; + import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; + import net.nuclearteam.createnuclear.CNBlockEntityTypes; -import net.nuclearteam.createnuclear.CNBlocks; import net.nuclearteam.createnuclear.CNShapes; -import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlock; import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; -import net.nuclearteam.createnuclear.foundation.block.HorizontalDirectionalReactorBlock; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; import net.nuclearteam.createnuclear.foundation.block.MultiDirectionalReactorBlock; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; -import java.util.List; +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault public class ReactorRodInput extends MultiDirectionalReactorBlock implements IWrenchable, IBE { public ReactorRodInput(Properties properties) { @@ -59,7 +59,7 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level if (level.isClientSide()) {return ItemInteractionResult.SUCCESS;} withBlockEntityDo(level, pos, be -> player.openMenu(be, be::sendToMenu)); - return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; + return ItemInteractionResult.SUCCESS; } @Override @@ -74,54 +74,18 @@ public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable L MultiblockHelpers.handleAdvancedPlacedBy(pos, level, pPlacer); } - // @Override // ! may be useless - // public void setPlacedBy(Level worldIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { - // super.setPlacedBy(worldIn, pos, state, placer, stack); - // if (worldIn.isClientSide) - // return; - // if (stack == null) - // return; - // withBlockEntityDo(worldIn, pos, be -> { - // CompoundTag orCreateTag = stack.getOrCreateTag(); - // be.readInventory(orCreateTag.getCompound("Inventory")); - // }); - // } - - @Override - public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool) { - super.playerDestroy(level, player, pos, state, blockEntity, tool); - List players = level.players(); - FindController(pos, level, players, false); - } @Override public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { - super.onRemove(pState, pLevel, pPos, pNewState, pIsMoving); - - withBlockEntityDo(pLevel, pPos, be -> ItemHelper.dropContents(pLevel, pPos, be.inventory)); - pLevel.removeBlockEntity(pPos); - - List players = pLevel.players(); - FindController(pPos, pLevel, players, false); - } - - public ReactorControllerBlock FindController(BlockPos blockPos, Level level, List players, boolean first){ // Function that checks the surrounding blocks in order - BlockPos newBlock; // to find the controller and verify the pattern - Vec3i pos = new Vec3i(blockPos.getX(), blockPos.getY(), blockPos.getZ()); - for (int x = pos.getX()-5; x != pos.getX()+5; x+=1) { - for (int z = pos.getZ()-5; z != pos.getZ()+5; z+=1) { - newBlock = new BlockPos(x, pos.getY(), z); - if (level.getBlockState(newBlock).is(CNBlocks.REACTOR_CONTROLLER.get())) { // verifying the pattern - ReactorControllerBlock controller = (ReactorControllerBlock) level.getBlockState(newBlock).getBlock(); - controller.Verify(level.getBlockState(newBlock), newBlock, level, players, first); - ReactorControllerBlockEntity entity = controller.getBlockEntity(level, newBlock); - if (entity.created) { - return controller; - } - } - } + // Only act when the block is actually removed/replaced, not on a mere state change + // (e.g. a FACING update) — otherwise rotating the block would spill its rods. + if (!pState.is(pNewState.getBlock())) { + // Drop the contents BEFORE super removes the block entity: super.onRemove() + // calls level.removeBlockEntity(pos), after which the inventory is gone. + withBlockEntityDo(pLevel, pPos, be -> ItemHelper.dropContents(pLevel, pPos, be.inventory)); + MultiblockHelpers.handleRemoval(pPos, pLevel, ReactorControllerBlockEntity::removeInput); } - return null; + super.onRemove(pState, pLevel, pPos, pNewState, pIsMoving); } @Override @@ -129,7 +93,6 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { return this.defaultBlockState() .setValue(FACING, context.getNearestLookingDirection().getOpposite()); } - @Override public @NotNull VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) { return CNShapes.REACTOR_INPUT.get(state.getValue(FACING)); @@ -144,4 +107,4 @@ public Class getBlockEntityClass() { public BlockEntityType getBlockEntityType() { return CNBlockEntityTypes.REACTOR_INPUT.get(); } -} \ No newline at end of file +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputEntity.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputEntity.java index 671ede8..b7819c8 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputEntity.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputEntity.java @@ -2,7 +2,6 @@ import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import lib.multiblock.SimpleMultiBlockAislePatternBuilder; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; @@ -17,13 +16,10 @@ import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; import net.nuclearteam.createnuclear.CNBlockEntityTypes; -import net.nuclearteam.createnuclear.CNBlocks; import javax.annotation.Nullable; import java.util.List; -import static net.nuclearteam.createnuclear.content.multiblock.CNMultiblock.*; - public class ReactorRodInputEntity extends SmartBlockEntity implements MenuProvider { protected BlockPos block; @@ -70,25 +66,6 @@ public Level getLevel() { } - private static BlockPos FindController(char character) { - return SimpleMultiBlockAislePatternBuilder.start() - .aisle(AAAAA, AAAAA, AAAAA, AAAAA, AAAAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AAIAA, ADADA, BACAB, ADADA, AAAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AAAAA, AAAAA, AAAAA, AAAAA, AAOAA) - .where('A', a -> a.getState().is(CNBlocks.REACTOR_CASING.get())) - .where('B', a -> a.getState().is(CNBlocks.REACTOR_FRAME.get())) - .where('C', a -> a.getState().is(CNBlocks.REACTOR_CORE.get())) - .where('D', a -> a.getState().is(CNBlocks.REACTOR_COOLER.get())) - .where('*', a -> a.getState().is(CNBlocks.REACTOR_CONTROLLER.get())) - .where('O', a -> a.getState().is(CNBlocks.REACTOR_OUTPUT.get())) - .where('I', a -> a.getState().is(CNBlocks.REACTOR_ROD_INPUT.get())) - .getDistanceController(character); - } - @Override public Component getDisplayName() { return Component.translatable("gui.createnuclear.reactor_input.title"); diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/output/ReactorOutput.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/output/ReactorOutput.java index 7ed93a4..f56e114 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/output/ReactorOutput.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/output/ReactorOutput.java @@ -1,25 +1,29 @@ package net.nuclearteam.createnuclear.content.multiblock.output; +import com.simibubi.create.AllBlocks; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.kinetics.base.DirectionalKineticBlock; import com.simibubi.create.foundation.block.IBE; +import net.createmod.catnip.placement.IPlacementHelper; +import net.createmod.catnip.placement.PlacementHelpers; +import net.createmod.catnip.placement.PlacementOffset; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; -import net.minecraft.core.Vec3i; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.ItemInteractionResult; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; 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.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; @@ -29,76 +33,50 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import net.nuclearteam.createnuclear.*; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlock; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; -import java.util.List; -import java.util.Objects; +import java.util.function.Predicate; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ReactorOutput extends DirectionalKineticBlock implements IWrenchable, IBE { - - //public static final IntegerProperty SPEED = IntegerProperty.create("speed", 0, 256); public static final IntegerProperty DIR = IntegerProperty.create("dir", 0, 2); + private static final int placementHelperId = PlacementHelpers.register(new PlacementHelper()); + public ReactorOutput(Properties properties) { super(properties); } @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { - //builder.add(SPEED); builder.add(DIR); super.createBlockStateDefinition(builder); } - @Override - public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult) { - if (level.isClientSide) - return ItemInteractionResult.SUCCESS; - else { - ReactorControllerBlock controller = FindController(pos, level, level.players(), false); - if (controller != null){ - ReactorControllerBlockEntity entity = controller.getBlockEntity(level, pos.above(3)); - assert entity != null; - if (entity.getAssembled()){ - ReactorOutputEntity control = Objects.requireNonNull(getBlockEntity(level, pos)); - if (control.getDir() == 0) - control.setDir(1, level, pos); - else control.setDir(0, level, pos); - } - } - return ItemInteractionResult.CONSUME; - } - } @Override public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving) { super.onPlace(state, level, pos, oldState, isMoving); - List players = level.players(); - FindController(pos, level, players, true); + MultiblockHelpers.handleOnPlace(pos, level, ReactorControllerBlockEntity::addOutput); } @Override - public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool) { - super.playerDestroy(level, player, pos, state, blockEntity, tool); - List players = level.players(); - FindController(pos, level, players, false); + public void setPlacedBy(Level level, BlockPos pos, BlockState state, @javax.annotation.Nullable LivingEntity pPlacer, ItemStack stack) { + super.setPlacedBy(level, pos, state, pPlacer, stack); + MultiblockHelpers.handleAdvancedPlacedBy(pos, level, pPlacer); } @Override public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { super.onRemove(pState, pLevel, pPos, pNewState, pIsMoving); - List players = pLevel.players(); - FindController(pPos, pLevel, players, false); + MultiblockHelpers.handleRemoval(pPos, pLevel, ReactorControllerBlockEntity::removeOutput); } @Override - public @NotNull VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) { + public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) { return CNShapes.REACTOR_OUTPUT.get(state.getValue(FACING)); } @@ -108,7 +86,21 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { if ((context.getPlayer() != null && context.getPlayer() .isShiftKeyDown()) || preferred == null) return super.getStateForPlacement(context); - return defaultBlockState().setValue(FACING, preferred)/*.setValue(SPEED, 0)*/.setValue(DIR, 0); + return defaultBlockState().setValue(FACING, preferred).setValue(DIR, 0); + } + + @Override + public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult) { + ItemStack heldItem = player.getItemInHand(hand); + IPlacementHelper placementHelper = PlacementHelpers.get(placementHelperId); + if (!player.isShiftKeyDown() && player.mayBuild()) { + if (placementHelper.matchesItem(heldItem) && placementHelper.getOffset(player, level, state, pos, hitResult) + .placeInWorld(level, (BlockItem) heldItem.getItem(), player, hand, hitResult) + .consumesAction()) + return ItemInteractionResult.SUCCESS; + } + + return super.useItemOn(stack, state, level, pos, player, hand, hitResult); } // IRotate: @@ -129,6 +121,11 @@ public boolean hideStressImpact() { return true; } + @Override + public boolean isPathfindable(BlockState state, PathComputationType type) { + return false; + } + @Override public Class getBlockEntityClass() { return ReactorOutputEntity.class; @@ -139,18 +136,27 @@ public BlockEntityType getBlockEntityType() { return CNBlockEntityTypes.REACTOR_OUTPUT.get(); } - public ReactorControllerBlock FindController(BlockPos blockPos, Level level, List players, boolean first) { - BlockPos newBlock; // to find the controller and verify the pattern - Vec3i pos = new Vec3i(blockPos.getX(), blockPos.getY(), blockPos.getZ()); - newBlock = new BlockPos(pos.getX(), pos.getY() + 3, pos.getZ()); - if (level.getBlockState(newBlock).is(CNBlocks.REACTOR_CONTROLLER.get())) { // verifying the pattern - ReactorControllerBlock controller = (ReactorControllerBlock) level.getBlockState(newBlock).getBlock(); - controller.Verify(level.getBlockState(newBlock), newBlock, level, players, first); - ReactorControllerBlockEntity entity = controller.getBlockEntity(level, newBlock); - if (entity.created) { - return controller; - } + private static class PlacementHelper implements IPlacementHelper { + + @Override + public Predicate getItemPredicate() { + return AllBlocks.SHAFT::isIn; + } + + @Override + public Predicate getStatePredicate() { + return s -> s.getBlock() instanceof ReactorOutput; + } + + @Override + public PlacementOffset getOffset(Player player, Level world, BlockState state, BlockPos pos, BlockHitResult ray) { + Direction facing = state.getValue(FACING); + BlockPos target = pos.relative(facing); + + if (!world.getBlockState(target).canBeReplaced()) + return PlacementOffset.fail(); + + return PlacementOffset.success(target, s -> s.setValue(BlockStateProperties.AXIS, facing.getAxis())); } - return null; } -} \ No newline at end of file +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/output/ReactorOutputEntity.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/output/ReactorOutputEntity.java index 8e0a4c3..d8b9285 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/output/ReactorOutputEntity.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/output/ReactorOutputEntity.java @@ -2,147 +2,138 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.content.kinetics.base.GeneratingKineticBlockEntity; -import com.simibubi.create.content.kinetics.motor.KineticScrollValueBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; -import com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.ScrollValueBehaviour; import com.simibubi.create.foundation.utility.CreateLang; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.math.AngleHelper; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; -import net.nuclearteam.createnuclear.CNBlocks; +import net.minecraft.util.Mth; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlock; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; -import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; +import net.nuclearteam.createnuclear.content.multiblock.pattern.ReactorPattern; import java.util.List; -import java.util.Objects; - -import static net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutput.DIR; - public class ReactorOutputEntity extends GeneratingKineticBlockEntity { - public int speed = 1; + public int speed = 0; public float heat = 0; - ReactorControllerBlock controller = null; - ReactorControllerBlockEntity controllerEntity = null; + protected ReactorPattern pattern = new ReactorPattern(); - protected ScrollValueBehaviour generatedSpeed; + protected float generatedSpeed; public ReactorOutputEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); } - //KineticBlockEntity + @Override public void addBehaviours(List behaviours) { super.addBehaviours(behaviours); - generatedSpeed = new KineticScrollValueBehaviour(CreateNuclearLang.translateDirect("kinetics.reactor_output.rotation_speed"), this, new ReactorOutputValue()); - generatedSpeed.between(-1500000, 1500000); - generatedSpeed.setValue(speed); - generatedSpeed.withCallback(i -> this.updateGeneratedRotation()); - behaviours.add(generatedSpeed); - - } - @Override - public void tick() { - super.tick(); - - BlockGetter level = getLevel(); - - if (level.getBlockState(getBlockPos().above(3)).getBlock() == CNBlocks.REACTOR_CONTROLLER.get()) { - controller = (ReactorControllerBlock) level.getBlockState(getBlockPos().above(3)).getBlock(); - controllerEntity = (ReactorControllerBlockEntity) level.getBlockEntity(getBlockPos().above(3)); - if (controllerEntity != null) { - if (!controllerEntity.getAssembled() && getSpeed() != 0) { - setSpeed(0); - } - } - } else setSpeed(0); } @Override - public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { + public void lazyTick() { + super.lazyTick(); - float stressBase = calculateAddedStressCapacity(); + determineSpeed(); + } - CreateLang.translate("gui.goggles.generator_stats") - .forGoggles(tooltip); - CreateLang.translate("tooltip.capacityProvided") - .style(ChatFormatting.GRAY) - .forGoggles(tooltip); + public void determineSpeed() { + int deterSpeed = this.speed; + setSpeedAndUpdate(deterSpeed); + } - float speed = getTheoreticalSpeed(); - speed = Math.abs(speed); + public void setSpeedAndUpdate(int speed) { + if (generatedSpeed == speed) return; - float stressTotal = stressBase * speed; + generatedSpeed = (float) speed; - CreateLang.number(stressTotal) - .translate("generic.unit.stress") - .style(ChatFormatting.AQUA) - .space() - .add(CreateLang.translate("gui.goggles.at_current_speed") - .style(ChatFormatting.DARK_GRAY)) - .forGoggles(tooltip, 1); - return true; + updateGeneratedRotation(); + setChanged(); } + // Tracks the output's linked block position for persistence across reloads. + private BlockPos outputPos; + @Override - public void initialize() { - super.initialize(); + protected void read(CompoundTag compound, HolderLookup.Provider registries, boolean clientPacket) { + super.read(compound, registries, clientPacket); - if (!hasSource() || getGeneratedSpeed() > getTheoreticalSpeed()) - { - FindController(getBlockPos(), Objects.requireNonNull(getLevel())); + // Restore the generated rotation speed + generatedSpeed = compound.getFloat("generatedSpeed"); + + // Restore the output position, if present in the tag + if (compound.contains("outputPos")) { + this.outputPos = BlockPos.of(compound.getLong("outputPos")); } } - public void FindController(BlockPos pos, Level level){ - if (level.getBlockState(pos.above(3)).getBlock() == CNBlocks.REACTOR_CONTROLLER.get()){ - ReactorControllerBlock controller = (ReactorControllerBlock)level.getBlockState(pos.above(3)).getBlock(); - controller.Verify(controller.defaultBlockState(), pos.above(3), level, level.players(), false); + @Override + public void write(CompoundTag compound, HolderLookup.Provider registries, boolean clientPacket) { + super.write(compound, registries, clientPacket); + + // Persist the generated rotation speed + compound.putFloat("generatedSpeed", generatedSpeed); + + // Persist the output position, if set + if (this.outputPos != null) { + compound.putLong("outputPos", this.outputPos.asLong()); } } - public void setSpeed(int speed) { - this.speed = speed; - } + @Override + public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { - public int getDir() { - BlockState state = getBlockState(); - return state.getValue(DIR); - } + float stressBase = calculateAddedStressCapacity(); - public void setDir(int dir, Level level, BlockPos pos) { - BlockState state = getBlockState(); - level.setBlockAndUpdate(pos, state.setValue(DIR, dir)); - } + CreateLang.translate("gui.goggles.generator_stats") + .forGoggles(tooltip); + CreateLang.translate("tooltip.capacityProvided") + .style(ChatFormatting.GRAY) + .forGoggles(tooltip); + + float speed = getTheoreticalSpeed(); + speed = Math.abs(speed); + + float stressTotal = stressBase * speed; + + CreateLang.number(stressTotal) + .translate("generic.unit.stress") + .style(ChatFormatting.AQUA) + .space() + .add(CreateLang.translate("gui.goggles.at_current_speed") + .style(ChatFormatting.DARK_GRAY)) + .forGoggles(tooltip, 1); + return true; + } @Override - public float getGeneratedSpeed() { - if (!CNBlocks.REACTOR_OUTPUT.has(getBlockState())) - return 0; - return speed; //convertToDirection(speed, getBlockState().getValue(ReactorOutput.FACING)); + public void initialize() { + super.initialize(); + + if (!hasSource() || getGeneratedSpeed() > getTheoreticalSpeed()) + { + assert level != null; + pattern.findController(getBlockPos(), level, true); + } } @Override - protected Block getStressConfigKey() { - return super.getStressConfigKey(); + public float getGeneratedSpeed() { + return Mth.clamp(generatedSpeed, 0, 1500000); } - class ReactorOutputValue extends ValueBoxTransform.Sided { + static class ReactorOutputValue extends ValueBoxTransform.Sided { @Override protected Vec3 getSouthLocation() { @@ -177,4 +168,4 @@ protected boolean isSideActive(BlockState state, Direction direction) { } } -} \ No newline at end of file +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/pattern/ReactorPattern.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/pattern/ReactorPattern.java index 2dd9510..c776855 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/pattern/ReactorPattern.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/pattern/ReactorPattern.java @@ -1,27 +1,27 @@ package net.nuclearteam.createnuclear.content.multiblock.pattern; -import lib.multiblock.SimpleMultiBlockAislePatternBuilder; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.pattern.BlockInWorld; +import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.nuclearteam.createnuclear.CNBlocks; import net.nuclearteam.createnuclear.content.multiblock.ReactorAssembler; import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import org.jetbrains.annotations.Nullable; import java.util.function.Predicate; public class ReactorPattern { - //public BlockPos VerifyPattern(char character) {} private static final Predicate blockInWorldAPredicate = state -> stateIs(CNBlocks.REACTOR_CASING.get()).test(state) || stateIs(CNBlocks.REACTOR_OUTPUT.get()).test(state) || stateIs(CNBlocks.REACTOR_ROD_INPUT.get()).test(state) || stateIs(CNBlocks.REACTOR_FLUID_INPUT.get()).test(state) - //|| stateIs(CNBlocks.REACTOR_ALARM.get()).test(state) + || stateIs(CNBlocks.REACTOR_ALARM.get()).test(state) ; private static Predicate stateIs(Block block) { @@ -31,78 +31,22 @@ private static Predicate stateIs(Block block) { }; } - public BlockPos VerifyPattern5x5(char character) { - return SimpleMultiBlockAislePatternBuilder.start() - .aisle("OOOOO", "OAAAO", "OAAAO", "OAAAO", "OOOOO") - .aisle("OABAO", "ODDDO", "BDCDB", "ODDDO", "OABAO") - .aisle("OABAO", "ODDDO", "BDCDB", "ODDDO", "OABAO") - .aisle("OABAO", "ODDDO", "BDCDB", "ODDDO", "OA*AO") - .aisle("OABAO", "ODDDO", "BDCDB", "ODDDO", "OABAO") - .aisle("OABAO", "ODDDO", "BDCDB", "ODDDO", "OABAO") - .aisle("OOOOO", "OAAAO", "OAAAO", "OAAAO", "OOOOO") - .where('A', blockInWorldAPredicate) - .where('B', a -> a.getState().is(CNBlocks.REACTOR_FRAME.get())) - .where('C', a -> a.getState().is(CNBlocks.REACTOR_CORE.get())) - .where('D', a -> a.getState().is(CNBlocks.REACTOR_COOLER.get())) - .where('*', a -> a.getState().is(CNBlocks.REACTOR_CONTROLLER.get())) - .where('O', a -> a.getState().is(CNBlocks.REACTOR_CASING.get())) - .getDistanceController(character); + @FunctionalInterface + private interface ControllerVisitor { + boolean visit(BlockPos controllerPos, ReactorControllerBlockEntity entity); } - public BlockPos VerifyPattern7x7(char character) { - return SimpleMultiBlockAislePatternBuilder.start() - .aisle("OOOOOOO", "OAAAAAO", "OAAAAAO", "OAAAAAO", "OAAAAAO", "OAAAAAO", "OOOOOOO") - .aisle("OABABAO", "ADDDDDA", "BDCDCDB", "ADDDDDA", "BDCDCDB", "ADDDDDA", "OABABAO") - .aisle("OABABAO", "ADDDDDA", "BDCDCDB", "ADDDDDA", "BDCDCDB", "ADDDDDA", "OABABAO") - .aisle("OABABAO", "ADDDDDA", "BDCDCDB", "ADDDDDA", "BDCDCDB", "ADDDDDA", "OABABAO") - .aisle("OABABAO", "ADDDDDA", "BDCDCDB", "ADDDDDA", "BDCDCDB", "ADDDDDA", "OAB*BAO") - .aisle("OABABAO", "ADDDDDA", "BDCDCDB", "ADDDDDA", "BDCDCDB", "ADDDDDA", "OABABAO") - .aisle("OABABAO", "ADDDDDA", "BDCDCDB", "ADDDDDA", "BDCDCDB", "ADDDDDA", "OABABAO") - .aisle("OABABAO", "ADDDDDA", "BDCDCDB", "ADDDDDA", "BDCDCDB", "ADDDDDA", "OABABAO") - .aisle("OOOOOOO", "OAAAAAO", "OAAAAAO", "OAAAAAO", "OAAAAAO", "OAAAAAO", "OOOOOOO") - .where('A', blockInWorldAPredicate) - .where('B', a -> a.getState().is(CNBlocks.REACTOR_FRAME.get())) - .where('C', a -> a.getState().is(CNBlocks.REACTOR_CORE.get())) - .where('D', a -> a.getState().is(CNBlocks.REACTOR_COOLER.get())) - .where('*', a -> a.getState().is(CNBlocks.REACTOR_CONTROLLER.get())) - .where('O', a -> a.getState().is(CNBlocks.REACTOR_CASING.get())) - .getDistanceController(character); - } - - public BlockPos VerifyPattern9x9(char character) { - return SimpleMultiBlockAislePatternBuilder.start() - .aisle("OOOOOOOOO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OOOOOOOOO") - .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") - .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") - .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") - .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") - .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAA*AABO") - .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") - .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") - .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") - .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") - .aisle("OOOOOOOOO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OOOOOOOOO") - .where('A', blockInWorldAPredicate) - .where('B', a -> a.getState().is(CNBlocks.REACTOR_FRAME.get())) - .where('C', a -> a.getState().is(CNBlocks.REACTOR_CORE.get())) - .where('D', a -> a.getState().is(CNBlocks.REACTOR_COOLER.get())) - .where('*', a -> a.getState().is(CNBlocks.REACTOR_CONTROLLER.get())) - .where('O', a -> a.getState().is(CNBlocks.REACTOR_CASING.get())) - .getDistanceController(character); - } - - public void findController(BlockPos blockPos, Level level, boolean first){ + private void scanControllerCandidates(BlockPos blockPos, Level level, ControllerVisitor visitor) { BlockPos newBlock; Vec3i pos = new Vec3i(blockPos.getX(), blockPos.getY(), blockPos.getZ()); for (int y = pos.getY()-5; y != pos.getY()+6; y+=1) { for (int x = pos.getX()-9; x != pos.getX()+10; x+=1) { for (int z = pos.getZ()-9; z != pos.getZ()+10; z+=1) { newBlock = new BlockPos(x, y, z); - if (level.getBlockState(newBlock).is(CNBlocks.REACTOR_CONTROLLER.get())) { - if (first) { - ReactorAssembler.assemble(newBlock, level); - } else { - ReactorAssembler.disassemble(newBlock, level); + if (level.getBlockState(newBlock).is(CNBlocks.REACTOR_CONTROLLER.get()) + && level.getBlockEntity(newBlock) instanceof ReactorControllerBlockEntity entity) { + if (visitor.visit(newBlock, entity)) { + return; } } } @@ -110,31 +54,60 @@ public void findController(BlockPos blockPos, Level level, boolean first){ } } - public BlockPos findControllerPos(BlockPos blockPos, Level level){ - BlockPos newBlock; - Vec3i pos = new Vec3i(blockPos.getX(), blockPos.getY(), blockPos.getZ()); - for (int y = pos.getY()-5; y != pos.getY()+6; y+=1) { - for (int x = pos.getX()-9; x != pos.getX()+10; x+=1) { - for (int z = pos.getZ()-9; z != pos.getZ()+10; z+=1) { - newBlock = new BlockPos(x, y, z); - if (level.getBlockState(newBlock).is(CNBlocks.REACTOR_CONTROLLER.get())) { - if (level.getBlockEntity(newBlock) instanceof ReactorControllerBlockEntity entity) { - if (isInReactorRange(entity.getMultiblockPos(), blockPos)) { - return newBlock; - } - } - } + public void findController(BlockPos blockPos, Level level, boolean first){ + scanControllerCandidates(blockPos, level, ((controllerPos, entity) -> { + boolean inRange = isInReactorRange(entity.getMultiblockPos(), blockPos); + if (first) { + if (inRange || !entity.isAssembled()) { + ReactorAssembler.assemble(controllerPos, level); } + } else if (inRange) { + ReactorAssembler.disassemble(controllerPos, level); } - } - return null; + + return false; + })); + } + + public BlockPos findControllerPos(BlockPos blockPos, Level level, boolean first){ + BlockPos[] found = {null}; + scanControllerCandidates(blockPos, level, ((controllerPos, entity) -> { + boolean inRange = isInReactorRange(entity.getMultiblockPos(), blockPos); + if (first) { + if (inRange || !entity.isAssembled()) { + ReactorAssembler.assemble(controllerPos, level); + } + } else if (inRange) { + ReactorAssembler.disassemble(controllerPos, level); + } + + if (isInReactorRange(entity.getMultiblockPos(), blockPos)) { + found[0] = controllerPos; + return true; + } + + return false; + })); + + return found[0]; + } + + public BlockPos findControllerPos(BlockPos blockPos, Level level){ + BlockPos[] found = {null}; + scanControllerCandidates(blockPos, level, ((controllerPos, entity) -> { + ReactorAssembler.assemble(controllerPos, level); + if (isInReactorRange(entity.getMultiblockPos(), blockPos)) { + found[0] = controllerPos; + return true; + } + + return false; + })); + + return found[0]; } - public boolean isInReactorRange(int []reactorPos, BlockPos blockPos) { - //[xMin, xMax, yMin, yMax, zMin, zMax] - if (reactorPos == null || reactorPos.length < 6) return false; - return blockPos.getX() >= reactorPos[0] && blockPos.getX() <= reactorPos[1] - && blockPos.getY() >= reactorPos[2] && blockPos.getY() <= reactorPos[3] - && blockPos.getZ() >= reactorPos[4] && blockPos.getZ() <= reactorPos[5]; + public boolean isInReactorRange(@Nullable BoundingBox reactorPos, BlockPos blockPos) { + return reactorPos != null && reactorPos.isInside(blockPos); } } From a8213417387aecc40be613e6d6f872a59d8f2400 Mon Sep 17 00:00:00 2001 From: mathi Date: Thu, 6 Aug 2026 16:42:52 +0200 Subject: [PATCH 08/33] test(reactor): port the two gametests, fix an out-of-bounds tank read Ports DefaultHeatCalculatorGameTest and ReactorInputFluidManagerGameTest from the Forge branch. `./gradlew runGameTestServer` runs 30 tests: 28 pass, 2 fail by design. The four heat-model tests pass, including threeByThreeDiamond which is cross-checked against the community wiki calculator. This is the first runtime validation of the whole port - everything before this only compiled. The two failures are the *_expectedContract regression markers, which fail on the Forge branch too: extractFluids never decrements fluidNeeded between handlers (over-extraction) and silently drops requests for exactly one unit. Identical behaviour on both sides, which is what these tests are there to verify. Note this makes runGameTestServer exit non-zero, so it should not gate CI until extractFluids is fixed in both repos. Port adaptations: - loadPattern writes a typed ReactorBluePrintData (57 PatternData entries) instead of the raw `pattern` NBT tag, since the blueprint carries a data component on NeoForge. - Capabilities go through level.getCapability(Capabilities.FluidHandler.BLOCK, pos, null) rather than be.getCapability(ForgeCapabilities.FLUID_HANDLER). - BuiltInRegistries.FLUID replaces ForgeRegistries.FLUIDS, and the annotations come from net.neoforged.neoforge.gametest. - empty_platform.nbt lands in data/createnuclear/structure/ - singular, as 1.21 renamed the data folders Forge 1.20.1 spelled `structures`. Also fixes a NeoForge-only bug the suite made obvious: ReactorInputFluidManager read getFluidInTank(handler.getTanks()), an out-of-bounds index, in both getInventory() and extractFluids(). Forge reads index 0. Corrected, and a leftover debug LOGGER.warn in getBlocksPosition() that fired on every call is removed. Co-Authored-By: Claude Opus 5 (1M context) --- PORTAGE_REACTEUR.md | 24 + run/server.properties | 2 +- .../DIM-1/data/neoforge_data_attachments.dat | Bin 0 -> 48 bytes run/world/DIM-1/data/raids.dat | Bin 0 -> 89 bytes .../DIM1/data/neoforge_data_attachments.dat | Bin 0 -> 48 bytes run/world/DIM1/data/raids_end.dat | Bin 0 -> 89 bytes run/world/data/chunks.dat | Bin 0 -> 59 bytes run/world/data/neoforge_data_attachments.dat | Bin 0 -> 48 bytes run/world/data/raids.dat | Bin 0 -> 89 bytes run/world/entities/r.-1.-1.mca | 0 run/world/entities/r.-1.0.mca | 0 run/world/entities/r.-21540.17736.mca | 0 run/world/entities/r.0.-1.mca | 0 run/world/entities/r.0.0.mca | 0 run/world/level.dat | Bin 0 -> 1866 bytes run/world/poi/r.-21540.17736.mca | Bin 0 -> 16384 bytes run/world/region/r.-1.-1.mca | Bin 0 -> 811008 bytes run/world/region/r.-1.0.mca | Bin 0 -> 868352 bytes run/world/region/r.-21539.17735.mca | Bin 0 -> 94208 bytes run/world/region/r.-21539.17736.mca | Bin 0 -> 778240 bytes run/world/region/r.-21540.17735.mca | Bin 0 -> 315392 bytes run/world/region/r.-21540.17736.mca | Bin 0 -> 2772992 bytes run/world/region/r.0.-1.mca | Bin 0 -> 868352 bytes run/world/region/r.0.0.mca | Bin 0 -> 929792 bytes run/world/serverconfig/readme.txt | 3 + .../manager/ReactorInputFluidManager.java | 7 +- .../DefaultHeatCalculatorGameTest.java | 246 +++++++++ .../ReactorInputFluidManagerGameTest.java | 498 ++++++++++++++++++ .../structure/empty_platform.nbt | Bin 0 -> 208 bytes 29 files changed, 774 insertions(+), 6 deletions(-) create mode 100644 run/world/DIM-1/data/neoforge_data_attachments.dat create mode 100644 run/world/DIM-1/data/raids.dat create mode 100644 run/world/DIM1/data/neoforge_data_attachments.dat create mode 100644 run/world/DIM1/data/raids_end.dat create mode 100644 run/world/data/chunks.dat create mode 100644 run/world/data/neoforge_data_attachments.dat create mode 100644 run/world/data/raids.dat create mode 100644 run/world/entities/r.-1.-1.mca create mode 100644 run/world/entities/r.-1.0.mca create mode 100644 run/world/entities/r.-21540.17736.mca create mode 100644 run/world/entities/r.0.-1.mca create mode 100644 run/world/entities/r.0.0.mca create mode 100644 run/world/level.dat create mode 100644 run/world/poi/r.-21540.17736.mca create mode 100644 run/world/region/r.-1.-1.mca create mode 100644 run/world/region/r.-1.0.mca create mode 100644 run/world/region/r.-21539.17735.mca create mode 100644 run/world/region/r.-21539.17736.mca create mode 100644 run/world/region/r.-21540.17735.mca create mode 100644 run/world/region/r.-21540.17736.mca create mode 100644 run/world/region/r.0.-1.mca create mode 100644 run/world/region/r.0.0.mca create mode 100644 run/world/serverconfig/readme.txt create mode 100644 src/main/java/net/nuclearteam/createnuclear/gametest/DefaultHeatCalculatorGameTest.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/gametest/ReactorInputFluidManagerGameTest.java create mode 100644 src/main/resources/data/createnuclear/structure/empty_platform.nbt diff --git a/PORTAGE_REACTEUR.md b/PORTAGE_REACTEUR.md index a2cc9eb..e57d413 100644 --- a/PORTAGE_REACTEUR.md +++ b/PORTAGE_REACTEUR.md @@ -311,6 +311,30 @@ Les lots 1, 3 et 5 sont essentiellement de la traduction d'imports. Les lots 2, Les deux gametests Forge (`DefaultHeatCalculatorGameTest`, `ReactorInputFluidManagerGameTest`) sont à porter avec les lots 1 et 3 respectivement : ils valident précisément la logique la plus risquée. +### Lot 8 — Gametests ✅ FAIT + +`./gradlew runGameTestServer` — **30 tests, 28 passent, 2 échouent volontairement.** + +Les 4 tests du modèle thermique passent, dont `threeByThreeDiamond` croisé avec le calculateur +du wiki communautaire. C'est la première validation à l'exécution du portage. + +Les 2 échecs sont les marqueurs de régression `*_expectedContract`, qui échouent **aussi sur +Forge** : `extractFluids` ne décrémente pas `fluidNeeded` entre les handlers (sur-extraction) et +ignore les demandes d'exactement 1 unité. Comportement identique des deux côtés — c'est ce qu'on +voulait vérifier. ⚠️ Conséquence : `runGameTestServer` sort en code 1. Ne pas le brancher en CI +bloquante avant d'avoir corrigé `extractFluids` (dans les deux repos). + +**Adaptations du portage :** +- `loadPattern` écrit un `ReactorBluePrintData` typé (57 `PatternData`) au lieu du tag NBT `pattern`. +- Capabilities via `level.getCapability(Capabilities.FluidHandler.BLOCK, pos, null)`. +- `ForgeRegistries.FLUIDS` → `BuiltInRegistries.FLUID`, annotations `net.neoforged.neoforge.gametest`. +- La structure va dans `data/createnuclear/structure/` (**singulier** en 1.21, `structures` en 1.20.1). + +**Bug NeoForge corrigé au passage** (absent de Forge) : `ReactorInputFluidManager` lisait +`getFluidInTank(handler.getTanks())` — un index hors bornes — dans `getInventory()` **et** +`extractFluids()`. Corrigé en `getFluidInTank(0)`. Un `LOGGER.warn` de debug oublié dans +`getBlocksPosition()`, qui spammait à chaque appel, a aussi été retiré. + --- ## 8. Hors périmètre de ce rapport diff --git a/run/server.properties b/run/server.properties index 5a07c65..ba9b844 100644 --- a/run/server.properties +++ b/run/server.properties @@ -1,5 +1,5 @@ #Minecraft server properties -#Wed Oct 15 10:23:51 CEST 2025 +#Thu Aug 06 16:42:00 CEST 2026 accepts-transfers=false allow-flight=false allow-nether=true diff --git a/run/world/DIM-1/data/neoforge_data_attachments.dat b/run/world/DIM-1/data/neoforge_data_attachments.dat new file mode 100644 index 0000000000000000000000000000000000000000..3a9206e92793f82611804fe8834a4579db22c524 GIT binary patch literal 48 zcmb2|=3oGW|BsUr9wa4rdg^$lB&0nkW4x5O()H-fpOrj3e~$7nOgZs)vm8(%0HP8S AfdBvi literal 0 HcmV?d00001 diff --git a/run/world/DIM-1/data/raids.dat b/run/world/DIM-1/data/raids.dat new file mode 100644 index 0000000000000000000000000000000000000000..916260691058e46b27b9c6ab29699b003c188eb1 GIT binary patch literal 89 zcmb2|=3oGW|BsUr9wa4rdg^#SNlD=KI^(06#=w}yR=593m(cM|N6ySSvSdz(zxVQkTk1sVj%Ckfiueu93T{>a_cu6zz^fCiQv&J1UM z^P5qfu{tY{Be}_T`kISSOTgV|8r3C1XRaShdqW z?zB5>DYzXN;xVatAc>n*;jK>lq<#Fwh+^J8$*P#y^4;CDA`en)LW&G9u=E5;stbfmx%}BW z+t1BuMCslcsI$%Vo;Gz>vrA*Or50df6lz4h@TQqWM(if5O1=O-T&_sfpp%4*mA3%1yR!V>1t&$3yox6N)4iYsLGJ z(P}c)QdqWE$cM|ugz)Nh$#3yw7_Y<*RRs^nlE=&a$3ls49~2TgrJ*AHH^mUw@(>rp znF((BKo6~+n*cRhogw}de=M1~QFvN}LJEgUhnALJ?iTK?96ahL{BN!9lM=t={B|zs zr5<>mnE6=U|99ax^uWDwImUm$<%z*n|| z24lNeEvyRG9@Z9C18WCs18d(`EMrYy&@TDTqJs`&+gR&Kfo&x&{25?D-IZAL%Ftb? z=Tf=2GhWu8tzd zlBF^`e2l_-gwkg0um1)Wb>}wL(MxUZ`5nm95zD3{-s`z^Mb?@~4c;1P5M3%zK`{ab zPhu6He>aoby}4)ftVaQ~u8+C2IR1p3-7EB2Y2Shq?erViM5a969ltc$0odqHB;^Zz&Vcs7qS<$JEbgm(nj#Z^Lx+0kdSvPRGc`foX7Y!rv4JF- zK^lk%@JcWnD|e2LYV225>HD)Fn1d|ff>wV_7}WXjYtO2WBrAKQ(3ep}B1DZ{lXbo> z4eu-0D!9C+lq+1|(tDf!ZGEkm;i}`7Oqy-Bg#aWEb!L~r+jVVRM=tw=nd@~Wyy3Tx zM6^d^4*E+1y7mH64e#JJ=E1pTYaQ%tjSbQFv}$+X0)Z)*E?{BAfrs?0DKuKXKm*S5 zvh*L2T-DPwB<2B$9*yRcOEuOxTJI4r^AW1jdxtZlKTr^dsG}}dFM*8PWWdNI4!~}x ztANhLof{0IVtMVLxq8_pY_4w82$YTyfV2dzd5G?p`L}~tx{AYCw7|q$s4_kJ zWiadt$2!u1C%KmHw?Jt3zJgzqwXUURCk>%*@XD3^qPj1Y)sYJM5(u||?xk`hqD@W| zEus5i6viaFt}_&iqya}?fj!5C4E-jpRZw1t5!2(*ht(@#>nF$0Pha>97YMI#zbW

e_97BeDsB%ANtqW~#yU1yrau#||)rv zv~JpUj9%(|fwM*o3&N3mva`Fahjbngx@1PgSZtlu!-ws-uX z-w($WcvMzx><|wU>eC%b-%aZ`n4UlL-&I!6yLHy15pegzCi~TcK8$APcCNq;n0RZw zq>M!B%Eoyz|JVGWP)&#Z-3RkLB9YGgwMdJhfIhaL{ABw|EEJEzAlYQ>f381zGtv$K E0FTkT5dZ)H literal 0 HcmV?d00001 diff --git a/run/world/poi/r.-21540.17736.mca b/run/world/poi/r.-21540.17736.mca new file mode 100644 index 0000000000000000000000000000000000000000..9029059ff54f4225f1d0b001adca04c34e704036 GIT binary patch literal 16384 zcmeI#+be?s7zXfd*2uILePIY`yNzAM%%`!1_LIO(<@bI<&rVXNk%`oOtB?j${pX~HKx0k^l*Q%8=gZ5vI?jh?YM zLr(Rx%V&1A8y=Hxq+fL99{()LSTP3z5P$##AOHafKmY;|fB*y_5K#jE{Qm@BZm%VG zx|SA$w{4{bTU7 z;`eQILKv`e9}@R%{xyYuWORNyG*wlx)h0^NCKsr_%?|NxXPT)+tZO*RRCM!=5ru*> Z5P$##AOHafKmY;|fB*y_0D)){_yeHke((SQ literal 0 HcmV?d00001 diff --git a/run/world/region/r.-1.-1.mca b/run/world/region/r.-1.-1.mca new file mode 100644 index 0000000000000000000000000000000000000000..500e141f41565ff6cf073d2fe0559569e99272bb GIT binary patch literal 811008 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

{85UIO;Oo}A(Ws$k8Z5{&;|$Z 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 z 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 h@&AAEc7>%cS&WgzN3zhA#b`Xr zvOKD?7%K}ES&WwjRTgTp7>!3)mPbz(6J?<<3msXElZCb{@IU|p5P$##AOHafKmY;| zfB*#kHw655W-gEyqwx>r<$g2%|B#VGbyKm?R=d4ugUj>UG0d3O?|+C= zrhhsi%~8+Rct+u=v>vaj-Z>TmPFZ4gizWTMn9;Gjra%7NBGs_sCoaqUwkH?xE_w61 z8xpP8Tb`b5q;rU;`}fz3dD2C#O1tmU6AY#vOfsLQwOSHAuYH;4%{ngMO4D9nm!tDd zX7so{nLsys*N9zaIxh5%&S>h>m2LSQkGWAz+l}{m9)9xt^$C-|1+GsT zmueK+!e6^L>g5BU7B;V%j3E4^j8HZ&h3MrA!)c;wvRGi4MX2+Ii9{@4_z|`FzRzwp zFN-jeGRCqS%&5Wlg4(kN3{4BX+XxjGxF;;9IxJgRkM4J z$h|(v?8s&2Kgy}WD!&I$`F@^TAKxa~$ilrzoEpe4((?5DksaAud40Xj1p4w;zZhwV zsL&)N$ntcBTSacW+i07vkREJJzEF)?R6{Zah6#kE%g39|ODB2-!U#fLAdDfprHnN+Q4RS_AXK6T zi^<7-3@7W-!Po?)>_gM^X0x2^jbHla1sm(c*KOK6oo++BAajxbp`BwaE(^NB1FfB*y_009U<00Izz00bZafp-Zg(En%U zWB>nf_y12^B6WBdKgJ*c0SG_<0uX=z1Rwwb2tWV=qayI<{ePE#_y5_>=S@o;e$q=l zU|{$_e>1yt;5iYIaMen^K=Zpfsr8O=Mwy09o(`!8bh!>Geq`tr1GOQiDPL>nErmZ|jahq-TuCoqaU`o}-4~U!)=Z4w;I&QCZGN0s#m>00Izz00bZa0SG_<0&)Zt=>NaH{}1Q?hxh%z)%gCOoE3;+2tWV= z5P$##AOHafKmY;|7!3gh>i@Uj|3m#htomQK2K)au%S1Rwwb2tWV=5P$##AOHaf z$PrMW{(pP_f8vLH|G#Yaf6M#1|KB28>L_OhFbn|*KmY;|fB*y_009U<00Iygd4WGa z|Nr0j|4;jn@BjaV+W&s;|DW3^T|Dx0i3|{c00bZa0SG_<0uX=z1Rwwbc>)Ub|L0f; zIAz%XKdk-#{U@Z0 zGN{_J{jSE?M2csCPHx?Q`v2@yK4+`d#g!i3Yrht*%IFQd+is$~(E9~Fk2&APbNYHK z(aufIX*Q|e-)XA5iqxNm3ylY|9#P77B-g|xH8>|FtDOiS(*yGg{O_Bc*N>*f#hS*J zxp5;a=Ee`6Nm-GnfE8k{D*5d2HUKp&!Ad%+}hRrRmZcF2|4AV7B>Uj@@Hx) z4=lNKw6Ec#G2d}_{&K&^F?sr@=d@$#$xpVCM99ZIH=aB{;^22i>yqW?A+N(*6E2n% zI!D&+v){r#DXu&&5N@N1?)ZpFCSPbz6I~|x?1qKZ<~wgb1#pd2W%FuDM>dZjy89Ti z*Vjl*zEFksAd#>QI{WzZFiq{7v-0_cw!cVfow%9piM}4J@vFt;B2V4MDAQj0=|Ugf zhwbMjwg#`Nt#?grs9fCWduYG^seaYpC>B$(|9`~SG7>-l0uX=z1Rwwb2tWV=5P*Pu z0Y&TooDaGF59?=ac|Y|(a~Tc*$X|qb0|5v?00Izz00bZa0SG_<0wXT)=jZ=jI$Hc$ z65Xo4g)s*AR*oylZt7DeZ{69~W!yQWEp0qIjgxwDxhUwMugwp-+_I&4O+o9Nedh%7 zPu{H*|DLC!d8gRo<2)-TEo;6@- z>i?zt<)CopPe}=v%6>9y%nPHPi6HhAu(IcJ?r{9qlhYZ+f}#-1XDMrXmI`y?vKwdp zcw^@y^#P@&A4{D^d@7Lu0uX=z1Rwwb2tWV=5P$##ARt#jf%E^Yd_KTEYi|yMs(!#=I9r8)|$U1*ojTu;x^bO*;=?aiBkjlg<9XN zImwPptGpg=t4D9Vu_HzrA}TbQ7c~8JgKnt3V=jk69gGVzTemo9ckZcQ1LqA&Tz?M> zEe*Mrb7=NV-5d_3vo_Krsr`u9CuVI?My7L<>ca!(sg6y9fiI;eqB4K(WP8liD&-vi zHsD-m$e>~1qJ})%aVUeWzM5I^Q%t=?8mb#W6jxb?f!}kA?Udi}<2tWV=5P$## zAOHafKmY;|_#*)Y>i;>D1*rdrSO04mp#A?xs}S!X009U<00Izz00bZa0SG`~qy-eH z|5+L6{|~eOZxSr!j`U38_aOiQ2tWV=5P$##AOHafKmY>r1r(_NnYU2?53~NCSS@vs zKL>aN0SG_<0uX=z1Rwwb2tWV=5Ey9z1?vC#t5N?Cv;Ma$_scu)zT`VpU4^gV}B{fa6P)o-YTQK_K%5ua4_J>IBJpdzC> zglZuwEUF*z*^9m>2bDFdFjShTBv7fL`VpT@^gTOK#i7zc6^=?B)nZgX;-ihe#}bu2 zs-vhjqMDD257m$OoJ8Lfj4Byb7OLM-@uK2K^&>tR=zEM%?L)N()z7FDQQ=Yjh>tD$ zo&r<`sHmteqGCtIh3ZFquAuMPjw&9NJ}N&{>rhFf`VpV~=zG#pZ9+vuwFQ+Js#U0d z#OE^lo>Qn&P$i(cfJzya2&y0P*@eDG1Cu;(f1glDngZyDhU-g zsyV2B#K#AHk3Xs)R3uapsBowjq52V@_2_$SP?@8OL1l$%9;(%-e#9pieUAgGXjI0i zLQxS>38DHCA4l{(XHl7<+KtK+)dEy2QT>R|8T38ws6tTXp}K^M6BP%lAMrVkz9$e> zAu3l?+fXe*wH(!t_-sJmV~WZdl^3e5sOF-Yjp|2y0?_xIMwN!@94c8t4z9!XS7QDIQYpqhmWJ|OV_e*s7L_|@O4A945J`fld` z4&VR3F981V{(tKo_}_o~SXjRG-SGDh|Nevb?|)wa{{G+w1b)tTHKiQO0#=dIJ^MPjXP#iOa1uzpY1rE6 zsN5`AIz*gLS?A)veFQRfs? zyLw3L3nrQcn+xc_xXaVNjc4_xJkK;^F_)u3_>29cCC_ayJII+OxZ2*nQX#aNriks1 zrKWp|4iK=IY&t!MB6^nE+(o`eBvGkc6xs=D5QRpg_6`x&U{h|>c_}n0Om+pmZkke#aGs*6qQN}`-8S$scRUm*I$T&p>xDukASFve#Z~4~m7v!etyFau%)1b8sU6y`2U9OTcUF1VZ1~>WEAPPVg30PE zZP)$G!&?$c$bmN5aq)U}96iy}QCfBHoL>!O`p4gEBbv+d<*EN3>{Qrx;GL+mSfzQ| z{if{3PHwp>5zKHky@7}p_QGT9e^1dc=K6mXkrYE6^rZPvxjbos)ZRhDA*_7~o!65# zXTtiQHF13X&yLprzmKo~eaF`S3s!wx|7*soczw41ul}(9KPSyFo4)TD+&Kt<00@8p z2!H?xfB*=900@A z8)xMv)(x@I?{^$~EZ#QCKTun+Kt1{D{)}bw_AE^{(=0fa-r%}ZZ}&1o%3k{YlJ_fl zYs43MUJ<=xDYz4*+F`@3$7W6pENucb^QtCh4p%VgV9xvjfRp(HfYOH_0IZ0l z*w23e7$8_Dw`X1A=29e(@*WI& zcRoe?|L0c=n2XI%#Ybido2^=rR7o?C*JbYi`@K-E;(Hr*j-_aSL`6t=m0oxRXQmVV zH|Mkr$1bTW0s+|IAjzNtBMrYlmxsQ)9A%bnC*1Nx%4!80rN_qJZRtkbq8E7UHjnyk z_n+PFDlGDny5nS&F3ZdIQl~s=sA~3%*_!Tub@gdQ$gC^m55h$}-Akt)SkTw-v^zn= z;WA%2enZ}yLwCcjrex{)-8{Bt5Al4-HSa+}8v74K4M{=sBKf z6yW0sz-&x?7x^HObe1}AfZ#=}T8nXOcWpWQQdBa-(sXdgp@!`6uz*#0QnhJL!k2xh zhcjdn-PAiw9Bt_`HF=)dZZglZt^2HK{vnCAN{jF8e8TmTRp}LD`?P(>;Ko4!1V8`; zKmY_l00ck)1V8`;{`&&|V*mdvl^t{aJin86a@UN2{IYqsRf^w9wV(T0_lUvKPIJ3u zjXMld1Kj7CrFUIFQM2>(z=ME%-}n1Pe^oIWqAZP=_hA6w5}$>|d7|H@Yc-ln=ip54 z>W>cq=K^X_Jz0knyRkU7@Le2LMn| z001A>o=SBXVg>BC{$;WC_?l9GQp3Y8QC$H|JkvluSQ%LXV$OSW-McHl;1a; zD_uHI)0aN0)n0XVcoJ9bVr_g-(wiqU1}>oa|CaIPzm`z5$Km$ZOYbX1ryJ*I?Rqd_ z{+~Jb|B!4&Ja(JjH$-s8rqJmeMACJ-7Lim%clV@WG4+qhoW!aV)aFj|h$oFbre(CW zf`30f!XWy|x#Cc7r8 zE{EilEgMQOYiBbIrtK>RHx2?I00JNY0w4eaAOHd&00JN|1q3GT|Cha>uFEq+&qrDz z2=A(Fw8KuZIXke^({#Yc-M6d}kGoPrXgydl99pQx;hpnT&)9)LvXHTrw|95ci&+|F zb)1jOFolcZd{X?S1f8WwKcb>CYeN5j|9Jm@`se-s%O~{z^DH&NrM|$o-XHJ(e-Xv( z|Myn^y#N3BH~Rla#`^zd@EZ<{_5bJo-T!}eV*kI_hyMRV-|zpQNvx8>xIOyR|L^L? z?Elvp@Bhbsr~f}0_5aH)zT^HF_5T|*Fm_CVrwx|?0w4eaAOHd&00JNY0w4eaATV78 zChq@#H~)W<{eP-Y*sZVk{{@-*|8%dPL^wxv=Wgdu)xH>aJ?=yNUsFIq<|gd5_2i!7 zIPQquf2|yk{}We@wCWB*@qhJ_KGad|V*V^?)grUz*SWEyeJO{Fi&_dFn^udQ460+s z|7m1g?>BBIXkD-zi~n<9A8vr+|8l)4cTxP`-m&;U$&K2%t&GB7jwy%Q;muw8ET8P3 zA>188ebr5N#BvfzAe!;s_W$ia?EjyyVVFg`^Fi`=*JIB*j<-!Y%y{0 z^d-COFCPxwdwAB%p8FBM-fWjO%O~Z~YJ;S#7n(b$D&v$+DPOs3LT*1?%E}p;qZe&^ zDpGnO-`3^;krv~-&u?l{7W1~on5hdG{zRR1c$e6l{R?)PRuZ%BYPySY4AlI2U1Ue1 zo)N=5x41t=t+4m(UdG7NeDmQMc8N-}+Qm`g3{JNcn9Els-R=?iPM4nx~h+)?6QjR&{-`oHQR7kko9Q&}2^(0 ziObbH)S3BzgdET81Ndi=)_n%FvHkz^4ereRzZQ1J=BeUzkLZ_UXf5G ze~VH)*dOM@(!WK(eBOLJd`yt=@>NTde)Gf2SD^g=&L2Mi-@@I#jc4_xJkK;^F_)u3 z_>29cCC_ayJII+OxZ2*f3S06AVH>eZ1!Fc$Xh);}RkJajgJ{vujQ{hb&Hj7wzx4C) zf6WQ;f10Iy>+zPEVXsmApPmRa{_nOXGybnjYONp+o5Vc+k3CkUFjYgXxh&JqvOres zcAbG?9y z@n5h17ctNO3wW_gf%k2gWQn8^%KrBt@ zwRezk2y0(L=k=t`!DOQefnmZ-g}iq`VXTP(3!~)j>avT!+Wk9^xIpO5$G$w2m#K~m zR()LmYsRX0eYXCu{;>W(cAa4|B_20i1PFit2!H?xfB*=900@8p2!Oye75EqH|NmtE zpDF?K|0w_em_Drkr|BOU+%^b+00@8p2!H?xfB*=900>MGfl227S!eQJxEi`-{yH}E zEd4mV%FkPVYu>qmzvhK{2W!62k@IOeDE~iiW#_B%ypQ?+`{FW4AR45-a!e^#!KRn%FwK-)m<@4G;{m<(*^?Pt*-i-%a+$%CwU;ureLv{Qw`k0Qv?AZ-`aCmClDdY<<$~^~*w@ zo7~n}EB4p@0IhQuE!)|!qv@vuZ_NnOO%LUZUDwuKed|=sZI7%yWMPG1o%$s6$n%TZ zXD)xk*gi#`I9vt@fB*=900@8p2!H?xfB*=9z;qP&7w7-&HywoY|4aw}qx1h(P++(bYKkEOF@nD!vnMV#60sR;&^lW>?v(yBadH}zr&7=No>$BT=2fSWv&3JWWnF%@`FqEVxl>Za={D7VnmCZpo zLm!vLruw+nwrC8)sww?lwWfdFK5>$HxburQnG%C3StS3Pp=c_}oh3Hkq09pm}`hfw~1(s=%V0yF=Ai2p2? z0LD~YT-n#RI=0m;;cVZIP1oeC=Z5ZbNKV;;_W#XyGe}eAiNke(00@8p2!H?xfB*=9 z00@8p2uw$TN$3Ad_SDpBunPPdxIQsBE;Mp;^ZF4vwjpJAqNMfqtV`TniUd;LgF)}k zr|A5@^Q#5S#pb8tBeR6fR;@^?q#4NTGSC0>d!by#_crVtOVR#_ijeRsz4873-<;Dj z9MS&2Kmay4NHVCvNMn5eKgulKPPpZXl+_Bf|8HaOwsa$I(F?pa+W+5n|Jm)X!XhuJ zJ5EOFvb=0Bb;^^5s%Foat?B+(SD#jd%(_DUAY8=Ly>#k<1$_-qyAw1VF7uV+H{`uJ zbT{m3N|v7A&0}l!5YKpm-*e@J4j(&9TipK!fI$0RarrsL}c_Y49c00JNY0w4eaAOHd&00JN|MFb{W|Id}Q zIeJ`}`vi;jRsoAgPI09-Z7%MbbK-GAJ8Lgn$axDriZ8j~`SHi%2M*7Axw|#|*ShwV z7N?F~qSd8KS(lqTsxHGRoszkdM|NpHJfE{CG?Hj@Y^P4}Nu_;u;x^8j78Xk|52Far zj7c2&4L=J=zm0e3t2iHLAfMf2gQ?A!Q=<7|S!_s_v}*pQ-q*RYqa7)S725h+dD89O z47ADoB`V8gqIP-6?wgxvrnqZSgc9pLe?45d`(g35SH#Jw9x50i1G+O|qh~=Yqwp7A z!jtCZca_&s1w^BnsUyzPncF7FlTeB5&;&}wZ z#u@;Mt7GGrC!Foyarc_s*14f6`sp&v27twejBQioiNj@p00@8p2!H?xfB*=900@8p z2uw$TN#_666$9_KmkZ67WX)*88AZhwoWJ9AaZzB`A^f1veeSCp&8=*<)3(H+{r?sT zwzXCVaA`^_jVxqr^Z%dk|M!pY|D*Z; zPy7F9{{OT6|FQZ17x>ouRGb|M&W^|9=RZ^1c24nZzn7%yRef`Tsj|>6Cocznanfe|!s?|5qNL{}-&ymmHL3 z&j0tcTxnJneBG?zAwNFbEvJDmM$34iV>5*17m^UxJrcBvi@Yq7)DI zqyGQ+Edu8A=G)<8f`pf^TAK8mA6|YDv;RNf#VQ5fw;06|Nu!XRs^O}OP3uacoGDp+ zKU-fQ`o&zUIixCtt8LgHIB*~(OG3p}=2DfQ*BY%{Qrx;GL+mSfzQ|{if{3PHwp>5zKHky@7}Z`-L&t zbY|0k7<2xA6_FG}9rUF6P`Ny5fz;kX!Xd1E37yxIHfO^8KWpOn{69OI|Nnh_{@<55 z|L?e9l^_nAq^#`3rWvc^m8zlET$br)Ss*J`U1wmJcg9D;{4vb`PmvcME&~KW00ck) z1V8`;KmY_l00gF~z}Nf#_i{>R42s>qe2o>iPAIlC-PJ7b(rLpHj;t#f0nGLD{7%}* zT{8mm%jVryDSju_e$H+E5&Y3}q^@PPJ9HKWxJMZ$cQu`;*?DikM%Ul>{hXPBiyXq` zDwZwMHW0gfkxwx;SG^;(~aJXWr zR(RZlbf-fthKD`s)!H8Px4NZw^W4;OVD|q@Sv*4h|DuU^<;ME|3zGE~qW=FaYp?7f zr;dE+|2NUj9qa#B3AMwUyYyK;+5fTs-;vq>AHwYazxSd4|0irp&nUFD7{Orz zJJ$X>y>F24hFIlW>3q1u)+dduzp(PTiPHj!P5Fz;DZ*c3%rFQR?U(ki{TQE-6$_9n)rY5Io2ZG!*^fB*=900@8p2!H?xfB*E{{^fu!T&Gx{|88|dhY5WtuOeib)c4j{)@ba^ujqFjtAZtCn(+L6pTtOd{_LW zVtdPGoQ7TbnH6Umx08!0w7uAr4sr=yiGmLHOSwU(Fw_0&JD9%&+@^C7N!RIG%)iR$I|5uY`kf*}qhHC%;5C8!X009sH0T2KI5C8!Xn5F`g z%QHjIM_M5W@2YIH!%nd|JFwH!bil{mx2zG5yHY}EJy2C3Yt zs;A+Ef-U~id~t!(B*6zQvMK{=0jvijabYpGr^2Nd@@;Jn*wkWdap#^UWg+jHxn}AD zKgavcI=oBl&Hg33Oe^Jb?`q~aatzcIRSEA%)H7mO6y*1({CT35y_iF>|(PeWyM5YEuYLrOp&*V-0{KmY_l z00ck)1V8`;KmY`$g231N|EF`m(f?1x%*3A9BGnXZP|3sV7P9=zUhg-WCAyEJIV?DJ zPu;XjEIVez+lx;ysLYZ|xRLX)=r}j~`vtRW&L(MJoL?C?cdL`ee;T#-JN^G{I%~yx zuLWqG8}e*t!;Yrk3%tb(!$@N3}u#NfEl$j!~`N95Rs zmgNv7t+!`g;^tB$kn$d&{QsvY|L^>20dukWsrbk&VY5{$k}7Ei^196YKff2sReW#5 z&ao8jkEjRvoIL-( zdo2II9KRuNEdM{{@BIIgiTVGlKji;ge?R}FUr3H|^5buFSKF|M;q4o|E4q@#}=)9h^L)dN~s;c{h{Qs8gx(ni4PV6>U z#%wL2t62!v=1UIBUdkd1iZ)$oUL*LrS;0fTs!qFhcl1fef?{N|bU2Ixc66H+E;``b90#PgGTFoIUZ1ijWAX+!aU z544N<1+`rdre1vRtn#ke@V&QJ-htc6rxj%dlhp%DuKSsXw!tUVqSKA@vv!@Y5ZX*r#CFG0(>+B82=Z8a zDl_ySi^;B}zhoZy$3>x?paxNBDEV)QfX)WIP3L7M|7Taw`-TZK74qH%g-LY;ER2%7 zt9wZN)$Sx7ae>gAj}v$(FH;>CtQEvzla!U6*w|xL3R5-In#(f%EDL1CZr2$Y=Ar)o zJ?gOhpN@ZBaL*tB0w4eaAOHd&00JNY0w6GT1SakOm!0(dKL^vHZ=L@~Abo59pUzVB zulE0~nEU@W|7idJ8~J||_y4c{ANT(ceLw$iCb0^g|M%!q{@;Ie{-5N0hRxJ@=x`+< z00JNY0w4eaAOHd&00JNY0@F_5%l-eHulE1-Kkomp)gwygY5XA+6)hs#Exe1^_Hu;k z6L#zC{eQs^`~M=GqchofJ96}*1y4mvFXY?W93awSeE0cHP0C{4))+H&0mGlDvkvbP zd$WJRF4Ib4)?H0^F^++nKd*~OZ^We@z;8kE|7TmD-OfAU^Mklg1v?GFn=}VnUBFh<ewQ)gtL7+HeHjmo*QcKkesq*LkVWtLx%ped$r(( zK>!3m00ck)1V8`;KmY_l00gFxz*p=4<^q;)^#A|k_5Y{-|54rfzfRWw@As+yKXBml z{(r4hbrwufh_{qX@S|r&c28PdUT4RSz8Z01oLRqOo3V_+QI_Ixu5{@9HE_SuQsIBQy1EWtdCB0MuDap*VvEFk?h-l4DJ ze4K%Nc9RXJHe*hS=8I*qAz9L@`I~xQ=f;k9q#Rag>u=>rw|6tpCi9o5ER%`a(B zfE9D%c?8178UTu`W8;@6obBIn_nO?+xuGfg=`zd)fSKitt<&z^f*S?_5C8!X009sH z0T2KI5C8!Xm^uO<_W$#Z*q8EiwyW*bAGyxO*Ri5!cLEESap^)6?OWygzxOTl65dbT zz>Phj@JExCzn_R`$`%Htc>fF3|KIo%7oP99S=5cqDF08a&W@Bkp8t2vOT3G7w1Tj1 zZ^WZPSGnb;NlCs-S_T}&Gcv5aW?k@0pzgryC1ytQKV*<>)m*wrj;G2-4hC)vWx*E2 zG;5IN-smkdP|0h3CZh6g_>djLMi1@(eZ1!FcyXeWyitFV~* zM`R+_{w&pDkl>6he@te>$~+=VV^ipKcTXDnzaNu1iB%`4s_o?2)-G=ZCD^rAtjF89 z96zW$RIB$`87CH1%`P%9u;GrDyMi9kz}cyZS9(}BtI{}_74 z4*TLVNaa>lJq;%mZ1I=oiwm442|j3%RT)sTVtpNn3yZNm6+RvSu&Kq^;?6xy%0k{X zb5Q`m&+&fa0RT%-0DxTXUCo?5C;*_aN_a=2o)N>MAiqE5&&$1M8B4rgXrKT9Qxj2+ zfzV_6U8jEHp6}n&SlJweGxRZ%641xBwgq4qI!)u{!Gis)JnYNeia3V(Qz;BNUnprgIP-1%NjH-6^7H|2_gh0rPS5f8G$`4Y7(9 zpm-5a!6vW+~Pa# zkGWp5ZlB9AoPIAC+%X7%00@8p2!H?xfB*=900@AHF=)dZj-G4*U2!*Q|6h&g@6DEfB*=900@8p2!H?xfB*lU*7%wF#|nkBkVj&nqD zR;1tD`Fq(hBfj2cDW;WKQVBPd9u|eVvcI<#{Z&POh@u)jZ?S1zNt83?5}$>|`89r< zuGMHR6~dX^)gRCQ%X5{vRJFrvjn;2EEST0xr?LD$o8(xO{}+Pt|B5djP)s_lC@bWz z&eC?BW`3qQp~NK6s3{$Ej z^!Wn>szTnopfJ|N(+hVXA)4NpfBG#oDT z$>28}cys7(*wx%DJ-?gB*6bmkzk1DkkkCdXmC=2u4g&-)A}NwONTD6Vrj*fhJU{FI zpN*;SA|E7@&Qj+M5M~mqq%dxeCiMSjf3yGpTl@cus~Fp+&O?VQ0Ra#I0T2KI5C8!X z009sH0T7sW0$=X`D{WC}KSJSi+4_)0;MZWo4)gr<7OQF*uOpiu%nX|OXydHh#JV9i z`u&b$kHyfvOVyRYm z+=FzdLoJ4fJ?hok9`v`mrFZk()N_=R5{j@R&=U;GqMk#~zWUWhs`Mjt_PYc%lrsKoX z8se=`ak}A=(XJ;gzr4;qJNjzm>C-by*2J30tPh!$V8PWZeL&M!(--ys$LihG*&VaY zLhI&xXTMpQ$+7oZiRO;%e_q`z((G}#=grb4rRemA{GWG)RtSC3|4(K1|FdGUE64l) z1&0W8FbgO&8nt)ev!4L6E9ia0gqdrZ{r_`1PA`m?Yt&sM@@n^PZV`d=w|0eNC@)hT zrPoH{Bu-{2p#J|DmDQNZAL?@v0|Nd0Uu`FN}(73{>lDQ8Z09YooKjVIb^LhKoHR|im zQrR)r&+|KJCwI*V$S<3BTc!A&RQtJ~b&nVv?KHPr*0{qUHNbtIS$fy?6E!c#&g0Dw3a z0I<2M*JCUIKzlSjo05l#y z0FdoF2LSFv2LQ?>pJx65fR$v}OuKgrZWshW00ck)1V8`;KmY_l00cl_>Ih6a|6j7F zrdESh;Mc(QiNSH9k(-;>kI1nNtu!Y}T5r#~#LcBhAmu$6^zM9$VU;+)TEJXvekwjP zOW17Hilj=KfxK>jpG>{q3*{=lw_)d4iuOlTgoIb=g-38^I?;b~PRnrYlDZ-gfDI0k z3@R|v@cVOl=)22NX6bgqEl;GZRP~hwR|9dGV-#7pOBQV+izuWpF_@n1YUCU~B=qw6wk1|f~YC`+}_Xccq z{e9ohnJG%DleRo=XB2!=X`h|AjgzMJ-6fcZ$prUpMlI zQ|rKAqWNBWTVRm1YLQv<>)hDUzLdkoMJMklg1v?GFn=} zVnUBFh<&aL;FqTD@_3fnVYcJ){}dR zgJS~`k(0N|^EO#k?MZR7p_T0+fZ{r~q-0Dy6R)~@rP z0suVG0f6#YdlUdL%sc?FlI~8SDSVazSl>y0O|0^v26@t?FdqT{J{$lTurNyQt}Z+C z06-q*0f3Lk4**=SN)U%lVjcjPRUKPomTj}KPyKE0O;Ts8CqGsbmddbOvuQv zVA;P|zBNWrpZn*Zcmmr_H6FU3mc9(X;r`FQ8$(%G3q)RRJ-#CSM*OYDym!xbsl6NS zZ*5((>7a5dDOz}r#%}_3+D`-6sBG~ERaL@IhSn(9Wdxpl-!f~?*7Yiv3O&;rIDa{s zrEsx-wC08F9}aS6>26PMiG?lsgRqTQrGhaVB(#&oh*jv6zei*?tbGjCVGtb!AoGYU zjnx?-EX7PV{_o8k|6fqLV*M&hH2$wJR9iDw0cRC|TUugZV8b0PZyEiyvbNSu9IqAj zdKe{px`tTm7Y>*xok>~0ruiV-FDx<78K%?l?Sfkd0T2KI5C8!X009sH0T2KI5SS_g zU(EmCi0BLF+0B1JU6*Huo{zLb5Z+bUXosC*b9P{-r|E!?yKh+|9*6S(TMt$YhZd@F zc;_(mj2-sHWsu6Ps(KnuDA?jJ%@-FqP2zdbBC9f>cAE8dBrYt*_Efm^LcXod0h?M- z{{KBq%0k{XbIsHRevbE>b$FN9oBd06nO4f>-qp<6!!b}(SS7q8QO}5BQIOxC^5^B= zvy3HPFElb<9WgZ#;RZIM0i82V#T=ie477vb!*5A57QZ+|HqEa{|hI&sdtz-+R|kRe|Tnl z$vn%p?z5sLqxpZi#dq8vqxt`}p$vnm^2p&jKmY_l00ck)1V8`;KmY_l00gF?z!&TP zo%$o!XDG=|y8d^r8=P$Y{}iqN2_y>{TX}nTN4=P(QC7$KxC~Rc7|tifUrNwfiu5BY zDzhf!|MidO|D}JP|F?WX{vXd$6I|*GeCz%3{J$4b%=|xZ_0RMFj(;QnZ)7b0PX@o? zz*zoY?%(-;S10EGd40(LJM{hhznR1;DU92r3G089|2JX%FZ1{M|MUF6&)5I>n~?uE z4gb2}mO%gnKmY_l00ck)1V8`;Kw#ST_Nypd%4hTN!E-eoKaM4!TCE* z7Z(L~9l{U#+~>Z!(cH>rJ8erG%KvYXU|W0d04_~wrO{XG{~6=!|7wbp?_;IZ3u z4kGC~U5l9o_%Q*H*OPV#+wDVDb zYV#!rWiMrs1x1^#G_MhS-K^jtUsb1FyF2=%W5F=TTNeG*jP+CJp~IDc00@8p2!H?x zfB*=900@8p2uwSHFV_D`IhF;i0vcC1RWkRna2c1$?9aI0;C$Xba*g`BwwXaQA8nkK zn^-r*M!(;2?6G*;DE~lh!2hHCp8x;* zko#Evzmr&qR$5h4c6t5B{C{(1{y!%(|6l1t{=XHG6#IGp{{R6U3RppZ=1F7yBLDC7 zLLtRQ-8CrxFU^ga|7Sm*|0lgl1cyy#=KmdvRaw1DL#?GO)8F#4te9b>sbTIJ9|_r8 zu>U{p{!3m00ck)1V8`;KmY_lU@8er+W%j&r>0heRp8ga^@+i8p^=-L*N@1t z4Jn-@N?LEvy2Q<;NFe1sK>PnsF{~2jR|}Yn%}>QgW(k|ET9H&qGmzH}@ROKU-Cy#K$eklFw5Wb}Fe|Lkw{ z|96k||Ci%8>~Jk000JNY0w4ea zAOHd&00JNY0@F-j()ItGN$3B+k^je>|DPoPPjEc{FM##nzsvt~MEQS3|0Ms9_Z#c~ ziT(dqzuEu)L+AgM4l=e+vo{NF7X&~61V8`;KmY_l00ck)1VCUa34GoEe=nzG#-P~! z%hyx5!U(_PK-E}b?U;m9IlW@1llk!lJysN~^w3t4_I9kjO+cz?F6k0mSg?@?(4%1Q2&3fH{~ws|KB^_|DPD_G}iy`B35ahcE2gRvGZg9 ze*?4sUzpkdk9PgTsLfqy`X9~w4|>vks9c`3!13vSnQk&CvFZf1xsyENNn?*`87-|~ zF`-8oL_ay#q_bA6_ga9~xgpPXHtcBny}(->K{L}s`C>~-x~m_g*KF{}T0)Li2-eBY zF|9wpsC{N>I%DHhdhBp5AOHd&00JNY0w4eaAOHd&00PrYfOR(;C9bUTh7p~>&)NRx z*!;gp>7IR^+%r$GSU3r!-qdexbX0B@EFD^_N0iLd_(LcvT12#4co(tl$#!!4#_E7Hk4qt zMKKJg*^33Y3j!bj0w4eaAOHd&00JNY0w6G@1is$?FUXqDf8lEAlKJb{%(L|4@G3uV z`K@{92L75C>K&~4LPyT0=aMxOecXR9VB5@xlF&x^ddeD&Ow+_mX3*@F6~ zS^70_5qbrG@<}`h{llyrvq=z2-0Ql|F3K7uD*4u=C()H9TK zuKx+7ug?GD8bAM!&QkQR&i}Jwp8sd_kIw)5e`)?-$OYE_)9p_S?iU0=00ck)1V8`; zKmY_l00gF#z}Nf#r*pqC|9=G|fVqC2-$^^UYeqnR*}U5-#qXrr&$+EXf++PTRXcBGjF%nP~EgxQ`X{-rQMh*OAhr4dnrb+qVzfGt7Gy6*ff?){AJLv$RU@ zZ4?|}FU7@wpH_s- zxi?>PTYVtg@-DI9+TlZPfl0y<}PvBqV{}bm^*17m^UxJrcBvi@Yq7)DIV^}5Pw+NWen{S7Y2@+nuYH8AM zet7vs0e&*|0WVf5@V>=xh?Y8p%Pm^AXgvN;F*hOe35x$S6)jLqJ%T&EYW8^ipU$nM zXwMxNs69$3{_k+OqSo(vMhx@Z;{Fu1!rrrcQT$)N`S1+8L?w@TZP)$G!&?$c$bmN5 zaq)U}96iy}QCfBHoL>!O`p4gEBbv+d<*EPv;rKu2|M2)f`w}{@Cv6TU8=Vj^Oqi*V z_bw=mH8Egel-ylicJWucf9DYw2)+5(mxuB))p5ZpK^!(oS=otAGgiebRYR@0EYr`j zKvt}}&cHD5jE{uua)#dYd$-_@K>!3m00ck)1V8`;KmY_l00gFvz$E?utRn3zF7Nke z*Ym+E2bp!Hxa?UG+sDQBdh+xC8h_%#^Bp&fy0JNAalBZa9Vt0_0rUL7YhL2roTC*c zJ`Yyj=q%H-Ptwz8-<13Cjo?;x?8?uqIJ0p(xtK!Ri%sbum(Z0c zG<53U4LXHbrGTmLU>*f{o6bQbU8idiNmOd@5Md2A#8o4$x`T?aSNHOlXfmX?1qMm07MV4_&W#=IOF3Lz)Kd7^v|8k3P@SaK_MI9T z*ZYmz2^x8pw~TNO8tw++2GYHwxoniX*Npm|vG|h#E!z{({=eG3ccL!;VE^A6n?nD4 z@n1!E_oQJl^^eJ%#Hth2=1%g6CyhO(Wwf+{e?L9KAo|I<;!tm;I)A<(ovz`U8N|0{ zm*$-162O>>i!1y3R>!uQC7kWsvFVze_1w^14#_E7Hk4p~W-vBPyH^Wt7z9871V8`; zKmY_l00ck)1VCU434B=p=Nqvv<>zcy+o?ZtlT|73?yu+k*>LOT#AperiZ9B#7}IB2 zI!K&Ll(gQSb%~oxkwD6Ofb##IPTv1t@uB}8&-*rP<+{TW!Z%#y+)R^_e3!Hg>=6H} zz{YcyqJP30SG-$ZO++lHRloJ+$UoeJRf~%~;IkXb}El z|1WLNZ7(~>nI*W|-nI%`@&{oXu}TGFHcV(ITM?^J=zlkvh_#QQ_6`uNvE`4+Y*?8` zWNEBSHyND(aF#l6fPg0d!>G-V$+Ne*yb+XO*Wz1`x6BNCtvpn#C!&lKi@MD&GBB{= zj*h#G9#PNPsfmMAd2jh7{r{O880J&xp~Izs00@8p2!H?xfB*=900@8p2uwSHFW3J! zZ1R0L2gTfTjD0v{J0jAgcXi@6jzp{pS$T$fWM&eNT<%7xhcg0t8&{v%d;i@W{$Ia$ z{Ga;3L+Yf*|J5cF+_xFc&{z6-zSQe@hrWu?IDPryQk$?EbiUue-T#02;rKsR=J9_c z$`~O7x--E}w4mp;oU`)3GuhfrU2lO3^~%*4Ouhs>sbG~GXh^8O|) z{tJktFlz5GfgNjqo!-X`2(0q0bUxf+8+e(lzp(PTNt@1EvEFL|TIYs5d)Tm}>GuL} za|F#y59Nz3De10$nqITPBWnpcS|PYRJIA#C{G#@m9xkx|Kkfds;D$i}1V8`;KmY_l z00ck)1VCU)34A^Oe=ntE#-P~!%hyx5!U(_PK-E}b?U;m9KL>0(c8k!lJysN~^w z3t4_8S}#8z07$Ht^r4Pw7xN2hyB$-JL>Hz;q51STTY_ggKb{PV#GFl@B$@lP2}e0KlZl0|2wCV~ai; z0I>fs0FaDjm`$nY4i^IgAOHd&00JNY0w4eaAOHd&Fuer+#r*%OtzYH;hxxFK%5!D# z9$yw!sTDFWUbN0aBP!aKng2)k`bmiMDpev;O+RF(YP9NN)4GxFp64}%>Ta%RQP-Te^%}1^Z$MxM_JZ>cm7|B?c@CaoPz4H z{QpF=U~`oJf0w6y+r;_*(UMQ||5qk%|D$bxIz5LXdY0PUh2{YMhwFc-|I_+ka3e!! zYCU(j8V~>h5C8!X009sH0T2KI5CDPcB`|UQ|K}v@fBld7|I4;|u5(TDs$1>Uz9wGv4qwErJIasS`%)Bbe( zqx}E21Mftg|3Uu$Dk3R{I_OFBp>lcB0;#=&ghN>S5<0IZZO%8_|9_vn{a-Uy#p|>E z|LPC>|D+X+_0#LUg1ZF)5C8!X009sH0T2KI5C8!Xm|6n=JpT_%4Tk)`|1kfLECBug zQ|rBls{sKJ009sH0T2KI5C8!X0DPXyi>%6k+G*C;k+`rJ+f(7v3;DJ-2W)CFwzzXold_O^&0I5efuH03W*y!o_GbT* zU8a?Cxpy^l_HYc;6jllENYpc8SQO;EDRHFnyGz#!B0zl#K1i*Pi%=CX&j9ZUu%h{Krk{On! zgRX83dEsF?tMa63)10uEeW-^sgcIG=J4_sH=`w^rJhQ!Io@HD2S<#Y15^Loa-*JD; z^^$e*Qik4id$r(xK>!3m00ck)1V8`;KmY_l00gFxz!&}hxbMvWE6x9^{~zW5ePjN= z^XlQT{6CS&^8dWQng6FzsLmo$g!=zwf*(CIvU}3v@;W z8ULT-Nt=xk93V(x1P2LAG4);KgGAC<>bwDhCe}WT+WeS2d#lSEK?%)LzV&#^%&^zW zL$!J$$~dv8+nOQ+0~@;jkMsW$Yz*Bg^w8l_KmY_l00ck)1V8`;KmY_l00gF;z?c31 z`Xe`4l>+bndd{B>w{A|1mXNCWqO6NCeU_zzE6s_L*4wi#adRmWNO=ziy*r;yKL0y)kHS*)@|DlK0 z6Z8LmY5SD_H`)5XzMD+M+Q(3P2ME^K^2cO0tjr^_G*+hj8|!~|t*_Sq?9BE59UXTW zJ))koQxgZL^4{`E=KpEK4AW`%YQYVI00@8p2!H?xfB*=900@8p2uvY?FZTbxm;X0O z{{Q6b|IhOO!ek-;?~IScQBj8R6nf}zDIfp>AOHd&00JNY0w4eaAOHf>PT-6A|DF0H z*R{Vf|8G|}G}-+B)5+)m1;^+A16U9KyZL`dH2+`p59j|I#^?V%KA-<@ojCu0^qcel zBNUnpa|GZGGY7z77>xpa90B+Vn^H-CMxm|6EN>^zrqHCmod3`MV*X#|@A?0lJkM;m zN#_3xUob4D-Ma-h3<4kk0w4eaAOHd&00JNY0w6GT1itS7zs|+iv7%@9|Hs~)$3wlp zf55kwt+5oMrbw!>O{I~Vk~K8RT8E-DggB@q&7hEFNV0`NDzd~mEgDNGIYyhMY{!yh zOE}RCO46ZwhB~K3-}9~SeLwE`J?8qeNB?}@&(Fsn*SxRmb)|Cfn^Y_})q8l?@VCL` zJ`#tp#wcWz%C#2j;2=q<%-u9X>7h3y|H!7r{3zkm=5Y^x3SXEaUGIR)h_~0#j&&~g zk?G}|x`*C!Am-VyhtgWJ^z;D5HoA*UPL8$D+^a#UBs-Kr+LhQ3{r|l#&i`}kuG@yPbwBORod54*&i~iU^#AL6 zsu*C6nEn3~m;+u9gN_%3+XzxTP1TZ?XC%GEa%$E#(sr@VJBKF$0T2KI5C8!X009sH z0T2KI5MV!n5BL8MjHzf5zRugs{(qhuOKk&XcCGj4xnvi+-qQWgf}NBH=a$B2b=~Lo zP~_Qd>P!s4yC1qc8gamH?s)%`mb8pUj-*$ zY@R{9ePZlP{=a0KN%QMU9l|Q1_5?=$|MtbCnf(7{jQoFWZnKW3G~@pN_I=6e{C|sr z(xFVvl7aIFXk#ynEJk@9($wa5$|OdiJT}f>FI4wSJVo3viKE>tJ;tE;w(^pv`Pa{C`Z^TCHxa>HPmZ zBIPLRRjkdR(M!3m00ck)1V8`;KmY_l00dY@;H&yS ztU-9z`d@Cg`u{eEcAmRoeSP=Jh9aX=XY0e3Q*is88}G-c?Mt3(OA6K-mz8^U*Ew2A zAGKn;wbi(XuDcD<{p#(V_PCO}o4?S-5x!QSD#F>h)fRaFMte_y6kAXCi7<9CAX>yl7^O*PlT+IBx>HGib=s$fr zGylH}UyQ{?k_JZ6+#mD*eVO>)DD*+v`rEQ3KHAeyX7f!Me3q9wVu2CW z4ZV|C+)gVwE`*8Dle2IfwCZu@m3SUbdixxYLh@m8fuzR{uMTT-Dkt$ZOy)rxJ$pz!=*(sJ2os!Dj4nmE7q*gGm^e>U0Ags^~#Gl65ULyST*Z}eA0$_ zqEipm#(MN0rpFWQu9Es0^ZluQ(W<(?85q-M8~^uO*l|C|BDyWL3?FJsIh$fo&(j|- z7pGf4>Gqa>B{=1A2i9VxaG}<3CtXWAj!sIsNmp51deTB^>Jd$<(7H7|2IJyv53mP071fdmdmmY;_}FJ491m9Ct2MmOIx$`&Xpjm;+4`h^+wwZ z8T!3m00ck)1V8`;KmY_l00dY^V7B}JZ}k6Xr9OlH{~zrCp9-Pv zW}TM~PXYoU00JNY0w4eaAOHd&00JPub^^21|94DhpZ_mR?ScCL2kZa7%h3PNc7I!N zU=RQS5C8!X009sH0T2KI5MU*NS?Yhi{j<;iyVbMl{J$*X@c%mhUuRC+#Y(Roo&^Lz z00ck)1V8`;KmY_l00cmQ%>=%f|Ci6RD&~}|_~l@az?>)!OINY1%I)n3gHX!%LV^@}e)n6vfbVybWSXX7_&$wzja6p# zWpQqVT;U@&SABI8%4?5lERe5jJQUP_G&6UJx`#r3wYbkF?Gi1HCAY$TWfe|7du8nK zqRoARl05Zx%$;^_+q%6b3Pyn<0nz-~a)mkp)Vb}B8XKe2`Ri8cp~BMNwFz|Y72KF# zNW5es?H(A0V(kAbdu@M%vHvgC!~T)=Kl}ei(Vci}Z1p@u&oFv3f>OoE0U*yqh||%s z2=QU&{=Z(lHx_rEw2+QwB>yoI0{Zat_AvMV=~M`BLs?ykoWP9K8AxK}rQ;syNHX^S z^~!GkIRDR`tX}fT{Qsj5^Z)ZLVE&)Y{;=S;DaVejxu(vuvp`qyCTntp3La{Zs#k(m$>Lb+fcM5R;7h-%iiNJL~#uH}%QZ z?eBek3XeX@NK#!Xo}tC@e=+~hYlyak#a=u-4hVn%2!H?xfB*=900@8p2!H@v34G}P ze_%{Si|}>cX4L;l1!cU$(ob%bbINa7kX(`NVP2S@w0(>x_olEqGHSPM%SoduL7~Ip zYtJ3l5cBbr9;}CQ^rCAs8pk>T-nqId0n?o3vj<*Hm~-4y599gRcGg~ za_+3e+-wOczOoBhz75}BdR8E2|DWr1$2T^#M9OHyT0alFg-mN$>Q5S%+Z!4tr*X@? zb)q17YB1BU^j2F*pIMFMnXvk${s;DH=iDDM=|t;ZwR&hQ@66@7E!s$KV5-2E&|GdD zp^jK!M0G=(>J_xpN{$PuM>wD?+y|{*9O9LD9!`4u9PfhU!{Wk8tzG!X*i(#n{}J?J zWM&n09E&TX24Qg()K>&DnKUqp=0-Z+rw$II-(jl*s@(j#?foy|4VPEFHto>gEIm*j zqI+?K*vW;Q%6=UBkSA_d|C_BM$h@9q)eMyn ztKj5|%`=F%PmGmYF1)8TM6%7K`E{iZVUv&4@ z&}(nsm$Xa!#sa{(oid40D36Wv*9+DC5>F8~OyX!aOOG)qzOB6EY5q0ycgZAyj4llM zl3d%%H#VBx+wBtt;$(c9y!QkIzwO4C63IyANus9NFV1zLW@NooS z6EgD=m9Zp{F%K|`_Q6(fMjY<+XgfbHwbbP&vj-l>)UHKG>K9*=t-Iulyx~vs%fY0r z)#}!Av8O7a^N5tAs8_KzgGS_x@U%Lm%Z;8d_{TXjQfTI^_2S`aKmY_l00ck)1V8`; zKmY_l00h`d;5+*N)fRm<|Bv8YlJfQZ{|d(Ze?!Qd4Jtx^A)x=i@SOjWojo)hTYXk= zSP%dK5C8!X009sH0T2KI5C8!d6Znq&|0DHuf6stBO(^-BW$1SAd!rF0nmoRFFAYqb z51!4z-LOwnYV8YoTn-JywT2id&10AiiaL? z%CI+avB09>{>G}-F!}BNUb13_^6ecV2%3INcKeV{aQ#6UoW;49WACmk33RiMo*TE& zr-@)4_~HKlB=i2i6F){ED=_c>-!X>)oJT*o|DPTQUm8r7WI#W}zg ze%aE15P&a!eY#KPC}aMAe|z+W`p)&1iKp_(_1UsEcP(5r)-dM(6>b*d-8=mj@%2Z< zVr@_D(?5Ae?Vy8oImFOp_uu9fz15Bq!0Oj%E-)`PxAjf31k&S zLl1reTkTJ3?ZJ-`$=nHTQx*3(Olx9JO1`*wF2Yx>u}C;f-+@xbi~Y-dooI@nSfrVZ z3?`toCOKto>iHqN=5nPy^CL11vlVvlC_^C6(`;Gly~D$R00@8p2!H?xfB*=900@8p z2(XvHm-GMWR>ho>6~7$p5ttLjVd*NCRk{7+{y)rjD@1!MZnud)1fAOF1|I__v|6fr5r~Cg-bTH!opX!y0h<|JU zUufC=AdBd>)G~aKJLPPOL48pF8M!#!`bjrl`jz06$8A`PmBNL;>n>>Z^6Q*f{X{K3 z+oUMh>GHh=Kao|D&yz{nL@7F28RJ%d*Yl^2l@y#+8dZS-m7nTeJ1f zl_0C)mC}#ujkYuA|F@~rwz1cD1*Zi85C8!X009sH0T2KI5C8!XU@d`J?*H}ni(J*( zD#&Z#FQ*cQ^1v9|IjFW$LVKLeMqvKmY}n&)BZZOwzoC$k|L;1J|F4jCSgYHVng3r~ zNTeKActx=pw4TZTU-gG)A0z+&ZU${9YrS}Q8V~>h5C8!X009sH0T2KI5C8$T68L)l zznD`@`zD|Im4h7oCU+DL$>gK%oaJzuL}clkTtj9EkQRSCzXbpFOk9c+uuQ5uQ9%#NN>zYok<@?UOKLZOOj6C@rSObiUHQh&9#MR0&~FYVbJk{ za2r9&K~uFPg^VQEO`MwI9yA-a`mW%xAOHd&00JNY0w4eaAOHd&00OKf@S*>|$e4Sz z2w$h>KEts}PPNeH3m1dA=q}KZS&@4^VbH2#SnUjUsm;&1`2zf^Xk6jbVc(vY zv+w`A_hJ7ZO6af1^;`U6Bp!Gu9X3l(4^V8Q+sXV{Y)hQ08l3vh17(nw-6PUP!`W-P zKf}2st{C$UH4fxJdP~05#?5~)kW$%H*#62%eR6cD{pqFzm(mNkGkl!B%f!v}+(}#{ z*=|RTjnV1+waR*^u=ICrBV9Iv8}kc^mrSJH1H(|)hmLo=w!h)5WS;6_|HwL0@fvzB zwptxwK8o(dTVt!|AsU|Ju}H@R(f}Q8gS^{^=Rztx!^?QDJ|9|XYwBR@T{|}iB&({A>`;YtotT`vXZ~xyfjQxKl|K10KkC2k|CWE; z|G&`<2moNOKP)&c2!H?xfB*=900@8p2!H?xu$aIX`G4|x-_HNruxGaXzoFe?77G_S zpc29))^1px{%a6QnR)-;^Sj@4{-5M*`G3CO%>UCa(c)NgE8JIB;pDSd#tzK(e@gPy z+c9_AxozwAnkX0riUdUSXUi4p1W@O;&)omlt(v+27wFvk`ThS?*?+$O?-@pKX6FCp z5y|rq;&ikuLVOs#8qv`Ejr)I{im&efb(r`6y|Vw7|EDQLGh(q9503)^AOHd&00JNY z0w4eaAOHd&z*YiZ)c2gZ|0?pBevG_fW{M7H5qAXK8UDCK>g=-M8}p8RP#S^8Z6^r}O`L z`r~Kv|KCpM|94D}|7-nr(zT@H=%kdJbd|-WCoPnw9s#9lNyKOkwGk^sAWI-9R7Tw| z#Tf4I#c#mk5=g^DvOkHRNDd_p45N=B9m}XfM6xL2)BJzVw3+;WZbtt9Z!`J-0Wm;lD%+mkwc9UkzR-Y9d76d>51V8`;KmY_l00ck)1VDhr1iqaAe_&hW&o?aX znP=k9v$8wplAKeI{LZnMP2ua$g~ZHB7gQ?PDci*xGSIZ~+<_;Pq9PX#Z##hsyol>v zQ)j2YBE&P!B%`;55&!p?Zo4&Di{3@*-%&4Tb=txBzuKbjzyC+@NL4sT zE3H_wLeEJ0#&u!Ug48Q7;z)EesbbZv6Y@zL=7~-{R2%Ejf0!Omw7W{`SDV|J>KCo5 z`(_F=(sK>!3m00ck)1V8`; zKmY_l00dY{;5+Jn%#*L?|NpiBAE62T|L6Rd;G=2VS?aaJ!+-z?fB*=900@8p2!H?x zfB*=vnZSqq{|ClYG-LnYZN~indcom0j_1E^G^s$ALB2YFq$P783qUp5a- zPS?A>sOs$eRnDE2n42vj#aDJA%eUeCOV0|#?EiDU?)b)rmPi?mSnKCuw~%QKOZ`bx zdZi-b|62gS@45?Gy>8PcRzFdT&o(K_b-H|S!B1pWRz^CKNY0~ZBr^ce zlR#EM^o*i85#l3gQA9%zega$VPYNTFWxp8!kUo0=KyFR)E%Vg#gLb>hm2BomI67x! z?%q*`NIFO}W3w*{jtc@H00JNY0w4eaAOHd&00JPuN&;W*|1%uBf5&vGZQyAMfhZ2W zJz|#6T+dci+Fo}Ojk=fG%{jmoe%aE15P&a!eY#KPsNdZ2{q4~g>O0q4CZ5VC*JsPx z+_iAgSR=2NsBp6o@80RRh_62)7HfNIpZoX^h?v}8%m9GP zXN{C8Ew+fd9MLkJH*1o^bLBLOb`3BC0J<~%R62&*1+yIw8|mRi%GB2=#5sAbJUBni zT-9ksj2h?TU;}wZ0D#Qqn=<$;FZG!KfSttRc3R1CAxwmxoQ30{Rgd$>000y-03eVV z0Fd+{0AP9r;5ZgnMh(K^DrSBT`1m70YY%>mNajvxo2t0SVOkS&Qu4*ca}mC3jYYy? z`VN#bUhH4y>qJuo#UjmQWH14xHOVP!Q_m0CHJ2;xnIDm9n61F9|3`MytXb)`!?S<@ z2!H?xfB*=900@8p2!H?xu$jOt^*^t($W^Vag1iR)aw=gc4~(&$gK8@!w8z{0oPWW;Or?0}5vL4$6Bi3C3hr;LY7LX$?(ZclW+>m@ z5rUxUw`8{u=>*pwl)+h?dpY**%921g`{=oG3w@dh)`7uqyYZz&@<|dWqM;K%Mj$I7 z7%KqZG1CAUodBEvUIDlmnOQ}BMIdiRtnI|lBan5Fj{P2O=f|a%=2)2xdmL`0L`Ujx zD3qtlQY88>XcUf;n~MO&RJJa+r?&I z791A@KmY_l00ck)1V8`;KmY_lfRzMhssF!q|DTZB3-|v&c>iB-3iUrLefIDyAOHd& z00JNY0w4eaAOHd&z;*&(&Hslr2;X4z|I6%J@6U6|E_S`8`=13nDG$!c#oz0y;Pz1D z*=_1f48Xe|x;q+i;5LVLp1WavefP?SBBN7h>%*2)aQmGb@5iX^OP*^>3f3E!m3wuU zu>e3HwPL%q)wqYS>Xp=-97~QvtCZUl#0>?GEEWvyNNhUxDkwSN_>*LxYlMdC{F)=-Z=6H%+;kP~|5 zecN2oJ=@gtONf^m`HlzXs$3tMs(oXB%~{Dj`|yj0(vgbS(0j4f>Im~;bSGXKTRjia z@C?s|bW9*Q52M|X3eWIzNPRkbHKL&l|H%r#NK$Jbex9%UJMksUD%Ne=VD($1x5`Le z?R*t^>y$@wOX&0+f9U!u7;au^Z_~mvp>n{>ID_aBZev(NH&r{AxouOcH`j5F6Nxkv zw)?i=z#squAOHd&00JNY0w4eaAOHfaBk)!I|Ly!g?7S6_|F=9&sd+26%-j9nm;YDn zO|xX3mkv(?0w4eaAOHd&00JNY0w4eaAi#D4v-JP-&YwO1uQ0U-`u~5h|DRunwukM$ zEjTa;fB*=900@8p2!H?xfB*=90P6^R$Nm3JVRg9w|H1qJtJO3M)_LjhBp?6+AOHd& z00JNY0w4eaAOHevC&0O%i*WW%(*t8FT7<9jwpzMXF{fn3F9&-B=0tH=x{760Zf|dL z!L*83jI7y1+~OYmvm#1a6Hq-h$4@6(9aSY=jU7UxFD6+U8f6|0+2UVBVqfqY%#p`iYwnYl~UJrwe* z#eFuN=veAcda73{BChA*opt@SoBCwy_V>O%g-0J{B&n_x&(I1jyB}l`-IiL04|1oR zO);ns>OUhFr&~Yi#!J5vobtF0Yq3(e@ORw>tzLee6RV%7#b=uo9Tv>hz; z*5Oe=00ck)1V8`;KmY_l00ck)1lUdBtNPz6si2H^So+D0a!&az3z93cJxlOGxpRUC8on`2Nzf0x|plT(3L6v7seWMkChx zdDtyvS_7j2U|eo*XqcSFE%Vlig5;^eOuy1wZ6$qXHIiq->X-T-*r%Oyf5@a0t$Wq# zp|QL(m*=)Fsm8 z3z83u3n#U9;U8m9F|PMV(2J3o(_H{%)F3Rbg8FK@3t$w@jdZ+E9UMl#!&V1Wx%qY5 z`(MHvF0XoR+M&N$dZ0W+_u>e#lM6YO{W$a?PuQI72;t5@BOISeM$7EAw>c24@q56Hy$CZj#>C&03cu3((*DkXjgfy&T3J4(`Lg^I&%P^ z&;ylUZRfK|_g8%mM0=I1%H5OCp4n!+Xmg(kPo66BEj+54o>a4HL9iA_$9=NJxz^M& z(@^7E%mDzN{gQIg%mILLx_eN{WfS-B?yl&GbR=220gqbAfIz?ptJpe#p3;+mE z4*-nJ3;^U2$QVS=D4G)?K7tmVbphZW<^n)&-F4egwu}XUn2|b@K8(C{Tn(4x^a4On z6$7l1n=4}hAm)JA!=U2@;WmPlgQjXp3K>bRn>aP+RzUtAOMUn7FdzT|AOHd&00JNY z0w4eaAi!<{U(El@=Y4zrfBjj)Ec5?EyTvRPE^pqh%4|!|2tBhF-ik7I&VskdD?tI!2OO z`|$Io%YU5;;cY0ZE0Gh7^4~y`S^huLVV3{Bvi~;!uVxGL|Lpdc1?L3;5C8!X009sH z0T2KI5C8$z5}57&UwiiZ|MMZs;Qs#y@BjOiXjZKC;^ApP00ck)1V8`;KmY_l00ck) z1lUU8tNQ=j`G3t_<&gjPgZY0ETWO|j^!3m00ck)1V8`;KmY_l00dY|;5+*N zF;AfX{|Ed3S6!nSu-1ErrvU*F009sH0T2KI5C8!X009tSFM+S_|E(Tpek=cfp5%|@ z|D(y@o&P_jS1KZ|=i!}o{k5C=Wb5|#zCMLVA7vz|t`yH;=Klp*M7O1u;X`dH)A@h> z@p5s@{J*#KE5Rv`J7)6#bQiQv=l?xXi_bPG%5}PY@9+FSA|wA#c{=}ZbSD4LlR#Ga zH2<#$KY^|GCxsEovIq)eL%=9{j!NNVSR`j!$nrR)=B?Z^Z}+DQ%7{f&_5}zM#lY*Oz(eV^;wK3T41;%0j8BrcL@agB$UoS}G{`AG{g!#B->|0)0P=I7-<5<#I- z^9WMsNv*w%HGnu0iJw4@B85$F{u@DWLS{aq3K702|7E*p%Ku~kl>e#I<^R9t|4qK2 z>9W*ohlc?H5C8!X009sH0T2KI5C8!XU^9Ua_y0x4+^a?SIyLthj@`dwy3{uCw1hwu zhu$7B%V(}@{HO+2N_#89ZO3^L{}X8l?jf=u?vF5<0Wxc-<5*l7H3*BVpiZ{~G<;|RXzjs| z5y{*MZBrHZI819|PD;MGcrLWx;Vl00ck)1V8`;KmY_l00ck)1XxMn^ZWnXv)un1 zwl}$8TE#0yHthLo{vW})B<1VZfB}rw5slJ2F5gtg3_T(&60uh z2WVq2i!4TY9n#di7XDZ5|60GDbS>#PIw|EQU1f3UNeiW^M?k4s5;0msZNxGz_9dq8 z|A|tJ?S8%Z4Omp`?Lf^f9Dk8C8f#7X4=X|8KLm|LY{H`($Zrw%)lC zWL3OUx~AS}d*M0%C5wY;TUqI?!?S<@2!H?xfB*=900@8p2!H?xu$#av_y4@}XTSfy zm)Z^Y|37&DFFs7OVYg2U&I)MwyjjBYg%(o#L7n|*e6EIEf?O?8nUa+#PW~FI)vpyo93Hqi5*D^ zn(OBz{qB&WlUbEgL9J zGVD!UEU+lJzp1J#1=?)PXr zKQ6U2$I5Kj<8WhPbfo@4#b(f&oDrT@ zr?l!1&p!Tf&UJfehAi~f;ZZ;U1V8`;KmY_l00ck)1V8`;*iGO&>i;A4bg2J-u>QAn zq~X}@(}MGY00@8p2!H?xfB*=900@8p2(XaA7xn*xm~Y?zJJf&A{lDPM{eKe6-v1|I zap9z40-2HZU&Dy}`(N(=CI0pPpMM2SkA>bkJPHVa00@8p2!H?xfB*=900@8py9s

1eHzgktIX=l;@k+i!bfbbVuKROYmaFxkgsbz6iPpunY%>Y zLm|If+-H++mKFzMGTc|zPS3+T>-uXq^~u)l?|pp=k3PysQe7#Yp~dlkG5-&xN;6=$ zFAL5K0w4eaAOHd&00JNY0w4eaAizojAL{>4_y6$=cdzT;pUS~+QnB1r@8Mm;-v*ca zNF2I}vqna#Tx+oo4w970+)X2t9(qIak8E1Zj}ks@9{1p<@P#ST^$xgQAq$1a&jy9b6E_(RuI#Q)mN5C8!X009sH0T2KI5C8!X00DLr_>TVn@5}##{{K(&|HS{G z>9gCX1?L3;5C8!X009sH0T2KI5C8!XU?G9e`~Nl7@~nzEB`bb8*ds6}io?=XEUR*R zdy@;MRlH(k{aL~m_u!uuQOc_5YUPK7(&3>N^j{{eO1P+`8%e|7VQ*{}p52 zL0*9zo4qC9PT&8hR5mg0|D723|3mFhHzl}~UcjBo>;v$I_*LZlz8H%Tw zpR^D&eA6u0xmR#wej#z@{vUOHXsYbB{S9X&^HdM}M>p>+_=&8Fe4b3oCQ8xKNCbsS z&0`MzxAx*6V{xRv!~e;ofe|z#6W|e5h(MM_Q0`F&N6~Xs3Ma!NWxGR`$0;>$Jtp&Z zf4ZQISVU!Csvu!J%SCpxxI8i)gK_2JPF63;($;Lfb0x^Cc%}5CdZX=y=lqu-d1zZ% z=%vG>fB*=900@8p2!H?xfB*=900^+1z~}YVH>Fnlamb zT5wHG2iU$)zEX8vDU55=7SAL+9B{QjRg|Nrs+-#Sw9fB*=900@8p2!H?xfB*=900^+1 zz}NNv{cq&|VYeGW{@)Mg|CJDEmTdQF!GS>l1V8`;KmY_l00ck)1V8`;SV-WD{J(vM zWA}O0M6YUX734MWms1Htd0>p~98_B=p*;@uBmSNNcbZW0H_OoN-uFf$N;G+V^IjU5 zI3GNlgS%^8-QO6cVvovSBqNrD6Mx#aQk||D!s#6=ADLjE7%jJ4cu#A{t~L|PKOXB4 zmJ4l~Z>}YFBqeCBpOf^vLyAsjRZ0cTI(aTU^x9k15_V|@#x%>~qM^*&HwMnr6n)-k z=e#{(W-7%)k2q!6o48m&NXPTf-a*|Mg)Jo_Ve&CA4^T-*mkl<)981-9z9FoD+Hv&V zvF6C%3vvyDDo<_t1$+7Ta^GQe2NrjS>Q8c}qkXWrSkf?od<>a+hnh!ZL;>&<$Wf#) z0-4bn(EE1_z#MF~EaLDpkGAvUQcH8J%!WM+w+@d20w4eaAOHd&00JNY0w4eaAi!<{{~yo) zN3MkVf5!ZO#9f*xyM0-3UJw8Q5C8!X009sH0T2KI5C8#I68Lcc|G=1v7UAoh$^R46 zzR9P4_lfZ2sUqLPqpImi zHLDf`YjJekCtI9rO)WDGHNJH=#h{*NzocBWZvCX&INd!c<#9XKVx@55??3epc-^K= ztZq@02s25{b&AOPdjSA}u>e3A=}00uk1!VjR52C-kTHm!Q8Xt)d;~3uXz0QhV{wtB zfl)N~7Xbk47y|&mMS3#=08ILr0RS~zl63lxKXg4+46sJb0DuY10k4Na#|y%31Stni z)shr4l3X`&YK~gbtXb)`!?S<@2!H?xfB*=900@8p2!H?xu$jPrKmUJo`v#c*|H1kH zy9%_OZ1!QnaX|nCKmY_l00ck)1V8`;KmY_-O5i*C|J4=|x3~xYtcX%pMOQ07B$N&h z&7S|iA|yzmfsy~O!pQ$$3jP0#{(n0W+IE(D?eH)l00JNY0w4eaAOHd&00JNY0&FHQ zTmQfI?EU{8Au`ba|AYPiBafl~pUwWV;J6?F0w4eaAOHd&00JNY0wBOz0$=3+KZqHO z7Thl~YyQ7m{qSu0|Fqfj{{?6A|C2Z;zAyj(7e@Yn$$yjozbLrBsj4+he!IW1teByE zdq)U@rr(l%Ye*-!{-6xb;@r!zcUP8B-Rz_1#x3+|B3K6ozwO4C63Hh?oQQ@_d=eHH z&dmScgv_j=dJ;a#|5rgY^x!A3)&8V~Bj|V7YEH!A{?GFN3%|(!m-svXAAOBT@tGz6 z9~ns7%33cTo(2R!00ck)1V8`;KmY_l00cmQtpvWP|EKr=InQ4IAE~F$R{#J1wf~P% z|2NLm|6ZTg|LvdG|AF7E|HlYq1w_vr)0%12YUqO zL~&TUie*)9Z*OwJw2D`ZtUpWmGXF2qpJPgyKS${Fnz$<6@P#Q-^_JRk@%B2}vCdSV z#S8d;CoM_SGz{OT5wG!K{a>!|5u2-6-GuVmV;T$O>lzOQ^)uK1se35oSBv{>I?=Jz zpY&9(R770Q!#nHxYd7`D*6r_oeF~30%1BaODW0JfT6RCkBDyWL3?Jl9VXprR>OUhF z$6Wu%OTQAF^0;kg{h#iFRxiKKiPcZk;fk7Pj!NNVSfp%s$nrR)=B>wM-tJEqlo5-l z>`N6SjAywl+bk}ROvhkcxwwW227>jtT-G z00JNY0w4eaAOHd&00JPuasprW|HuBnHUBR@GyiYRvh)8R`~Q{y_xXQ?f1Ur|B0w`@ zxpxl_1Ogxc0w4eaAOHd&00JNY0wBOX0w3=Gi;THfi|}=7?t5Tc(gl?YcFK0~h72@qJa^#9q^QV+!`n`v0x#lv*VNhRuL$vs zGs);}iK^ZAm~Oi@Sc~38>fcc>XLZ`a_~aS2gAOvbt~xf&iio-lwC7%9UPHAbi)1HK zoCohkoHbM)t+0)(brvbpp~>wH4U^NjW!^ebkUTY*=~sHIt)$PaM)FKp{ZieZ_i5+c zA2R7gYZqEQG?sVP9?vjX9_{J3oAc%`_^dGuVu2CW4Q;Ad(7xoxaUt~x2b6{Tpw){* zyb{mDNpGLyU66dtiT~Cv{A27X#_j$HW8VL6AD#=T@C+}9RCtar#^NGL1EXkeq~m?+ zATuDKI-ttUuiHNK2HtRa)oarZ{ms$?HjbHk?G}|x`*C!Am-VyhtgWJ^z;D5HoA*UPL8$D+^a#U zBs-Kr+Lc(5E*j2W)4dnxl6Ys#J9K9R2eLS!RU0?|!N4se^}_a7lIoMA#~f(32J7~k zpacRrN~2e2V<|cT7e!LMH8w`4^Vh2A%7vxBYom9y&)t|`a_o|cw0mG!WkdV%j@S0r z+?2#p*VsRj-to&d^j>VWI>LMy-HDgRRwEG&&+u5J<9U+vFxu^tp8ztcR8JzA@!x%T zK5TUqNrMprXyg7)dz|F`)O~?NS#3+MqWCuhFg+O-|>g8r-}jA$j!BdX99D; z>tWFGf^Zu_il?bs((;U?msn2CwiC3USnu7#6M+B-fB*=900@8p2!H?xfB*=vkHDAn z|9M}{{~Las|HnM}YW^R=xg=$`n8m_H4yc4MiM1P6r~ev+QeF`fq|gxZW`l~*UkDzl z3g>906>C=L8A;!`F05LRdgVnNiEbuUteSN~K54@|(W!@OV?Fv0)8mPDS4sV9b30T0 zqE&T&GccxE6qF8SYL*O~KR_FMS!6NF>yW1AwXoyk{C}wJ^!z_hfBek+|J&*L|BmVT zf34q6x|Vbtos@EuuCloFq=nMdBcN0*i5RV+Hewlr{SpWYm6}JCiX^r6;x}M%38Y~n z*`LHuB!`j)hSA56j%8FKB3bma`G3x|nfZTi#{BTI2%^u>H`G5af|3@w@TWZY6 z|BL=S|1apD{J&88r}=-nSy~*3$#7p;yKm+Har|Gb|99Cz{vYdo`|v~{00JNY0w4ea zAOHd&00JPuP6A)#|2>HLcK+Xydb+=7z?~+P{LM0SyZ61(h!Ra6-#nUuiSxm;Ik>yl z)%}f8D)y-SMKWSZIKi3xza*B;|4U+~01OkzjI93}swY9}{NF18R1gh4_z7&aKWX6z zbNZhXak$^3?fkgZ(i|(ZVUNR&h0&4v8wzFXF1aFa_>=r{B>px3Z*2$7kexm&I4cN% z00@8p2!H?xfB*=900@8piwS&D|Lg;x}tL2GhGcv_v(sy{sY_{TY)_(K2yi+%aezP{unf{p3bDr~H-$$rafi=7sr5+sAlvvGZ0Sqjt-- zoHVKu6gnKf_S^yAcRFQT`{H>l`L-rjI;7n>Wh^v+N;Rs=l}&w+*LCZ(0QdW4^J>qh z>s?<|b$0$L=gvyZ&6bejE4z^8+wlFRX9Z&R|G8dwd}BjPq>M(a_4BY>$h3x~{-p8$ zv;ffmz{drEx>u(c0CIV5i#C!Qm@4okG?yDksQW_8Wz--nu7Y{> zPo8xFp#P<>765k6EC77?$pXNq|11F1|F{4!eJRbH#ojzT4hVn%2!H?xfB*=900@8p z2!H@P34C4uKhFDB{V%-rN9uo(9rbcnryYz>o>4pKAY<#QW7DjN=*mEQ?ltB$R6DXr z?ynT*!Fv&B4V6bLY!P+NB4s-7|A+d2=l~LRCZz4>v=0ja+<$NZfWq^c?SHL3_%R}x zJE3i=;vR=7HO46Z#l;r=&C&zqA-Wewi2r5%pEyi2W2esw&I$q`00JNY0w4eaAOHd& z00JPuVgj@D|MRMe&N~0^Y&OD5^Z!CRo`3cZ>c%K+DG>>ik9m23N;A;xI0vTk~1CcgT=)%^Z$+^Gw(200sfQ! zHxJR!i}%Lj&XX3>(Q~lXjQ;;;pXL93fB!#!Ic*P%y?J;X5C8!X009sH0T2KI5C8!X z00DLq`2TqSA3_!O|DE$+vLt}Em7TsSI4cN%00@8p2!H?xfB*=900@8ps|kFl|BH;d zS2O1SHTONRE%N6ZmiEju@#k6D9dk*}sYib2Sj?vI^-n`i&q)_lD%dI8#TzovwDH`5 zCzGNg7Y=VbfeO5c>s?c4r@tb^GtMNVwt9IND13vIq|F_=q!i)e!G0u7lJxz`g0tty5wp4g=}Kj-EP z@T;P6g-?fldtM?qm!#|#vsk#u0hJIYv3A4i^k0Ke%J)Ko6dFR_Y(NS96}f(kUyQ^9 z52eFq>FEKAZFD=CKZ|XNb5(;=-+7=6(z1I*x@b6iP4{Owm&6rg-l4{U97u1;x7xV* z4+c^yn+n@sIjK*M4z)ksl;Bc&0e6Ov(|4J;nVvg|izM6asIf6RoxfID4;7aFu5F~t zMsQ<(A@P!lw0mF}>iW>}j@R}#oR!Q|J?tM@M=D-J@5NTDBg{w9op@_(HKWV_IUb92 zOdt)=(Kg7>eggQ|{Lk3@7fEXE!_V8}{!V-ex32Iul+~5U3Cu{Hfh0y=I_?p-B%QwF z4}DJs1FV6YYYPt_=D^)7ZOzs@SAwjHS4!8^8*MLS-2b1}qnWbPR|RJU0T2KI5C8!X z009sH0T2KI5MVWduk-(kIkmNK@~K}r$iZ)NN8wP;lSa48jwIEoFqvJl=;#_NLnQ5r;t+Ocx^*s9}<)U@#C*8*B z?m;P!+p!iag$sZGsdvEZHf>^ci<(53Nn);3MAm|z$g0Ta$)s$86df&$bR?0SN6<(F zrHYzIAY%|cqi9Zq_y}4Q(a`m255Q+X0Ib`Fvi&X6oACpHNgwkEfEupp9{_YcRSd93 z%pU+IFbBLI1|2U5w-KZqG*wGd$VhVC#HrbS9QOaQ+NTfC0|Fob0w4eaAOHd&00JNY z0&FEPOa9*-)1|h7rzHfUIP~_2Sw3?;TTy9y-AObmEA<)Y09W{BO9MgxzWDX&KAEF_ zbI13$M_;J#TyL3pDxX}REo*bv!bM|^yjr5d%|g6;r{5yJ{)kwt?WukGAM*d*bSy0y z`Tud~S0*?f!^R_GGx`6Q&l)LHS{V8NIih7cZ`LG-=gMgm?HZUUNS^A>^i$~=Y8T9Q zJZz+g7b#O;qY&rhwesNnG;>v_6)|d@kAn^583O<^n{UeCv%Eg+|Jz9{ZfEZQ!$j!G zSvU?_^*HlNJP#+meU3*V`LMV^Qfn7J347`ub#Mf&jLfY0WdENhfvkdP=)q55tNlrz z=l|EloRoZV@mz$jT4RxLn7#w0j2HWt`8v@QL9s|P85vAKX-#s<+SKzycFpBVd*(-E z8fGi(-cg2l@*e7cw)(q*!-4<^fB*=900@8p2!H?xfB>rrd`JEt<_Teod+^VSC}mZ2 zwemwk>G06({r@XI^#7{}{RR1d)BXQy?KDGHd-L!-AOHd&00JNY0w4eaAOHd&00QhJ z@OA(H{J2au>UA#FdWopdefI65ii zE?s4D=}8NvsYgJmS`sl@Lv6$g5y%n<3YEF_kI~)Vi{F67C6I=RWPcJrksL}I7)Bps z1_AP6tE0ZS|EI|N66V|Gzv=sd+26%-j9H3Cf5?RQ3f362`M! zmTeH1N2X&iu3S3F>OQmN|7nKPj9Bc&!{dMe2!H?xfB*=900@8p2!H?xu$90p^Z&eR zqF1%H3i2BG%c+E+JTS&~4yvt`(4IqP!~UKDcbZW0H_OoN-uFf$N;G+V^IjU5I3GNl zgS%^8-QO6cVvovSBqNrD6Mx#aQk||D!s#6=ADLjE7%jJ4cu#A{t~L|PKOXB4mJ4l~ zZ>}YFBqeCBpOf^vLyAsjRZ0cTI(aTU^x9k15_V|@#x%>~qM^*&HwMnr6n)-k=e#{( zW-7%)k2q!6o48m&NXPTf-a*|Mg)Jo_Ve&CA4^T-*mkl<)981-9z9FoD+Hv&VvF6C% z3vvyDDo<_t1$+7Ta^GQe2NrjS>Q8c}qkXWrSkf?od<>a+huH~mp2SZeN0Gt^WX5KI zUi`-u0CTX_vWUaaJlf8WOD)Z@G8^_d+(?Oz)Zb7jTX)G7dBdONm!pt&SgYIA#h$8A zTS%lFR(M6R8MG#6gs0Uht@^{WkAIwV36f^ZR^JsI76d>51V8`;KmY_l00ck)1VDhb z1itS7FXp+y$p4eswcelSl3nb2OZPtuc2XXkTN>ZoRnG09$g|tjnHYd~KXi9A;s7K6 zum4HRh04yA=0&(Xa$T6L&2kH84Gbgy4|B8G6yNDr!O0h!XAp0n7&}w{OSYLbzpm6F ztP*NZVATKH7n5e{|7DE&ADi2(<0;Lk|8L)yoUZ>Z3QC7EHA@E0AE1rBEV3Bobx2d2 z+bNS6h4R=qf4xxMFYy#{!z7M&v-B8);@iqgp5|XOf0s-W$mqh5FUhsNd}E{8z1==h zAWp`o$$L*g@Y`;DDUqB+;zTrbO~}kgRK|<| z;~%4pp9!irBMx`Y)c-C&nLY40rgn`{{}*3l)c?LS^*<(UtyZ@dv;Ift5h+JeuVQTm zjb`fq%Z;8d81;XxC2bdLy?A&U5C8!X009sH0T2KI5C8!X00FiV_>TVnAIblVTw1o& zIDDT*w8n?^f4Ra(Y_4L163T0jX)KVhYdkcw{!iUQA-`IjvHmYhivuwk?kj7j=i!}o z{k5C=Wb5|#zCMLVA7vz|t`yH;uKx?Nh;BhXnx;009sH z0T2KI5C8!X009tSF@dk||G%04cT-p$^8bD?|1bSK&78&FJUk8vfB*=900@8p2!H?x zfB*=906PhMIsYF!7%jM8WY+nAhx(D(=KpE`asJ<$bK?8v|9@fh|CjtX^Z$#2`SdV&d0~Fi z_A#DZtnk(!>Hn`ipRRX(QPtV`tDHM4F*jR6im&WKmT$xNm!1`f+5hKy-SLeLEs-)B zvDVMSZXweemim*%<@Sb#$!Xj&Z=EPeo*K;bE4|fL(q~p9c_yrWssDj}+Bx@!OghoJ zSFIiz%R6&Jbho3->{*7l(Kyo`;j( zKF7Nt`LMWfQfn9fG4>Q=ynh6}7@1i`9mnFzs6kj<1@#qyOePJCqPdZd_o;)!%oc!v zDmTAwd;d##!{t@4O*`~AOAnNX=w2Klc5)%7vLA;&|JkUfED&bn0w<*m4SPzjNdL7`1)Lb8Sh%dgHQkukJcWE9s+F zY`3-=_YhXSlA4oa$#H0va(jZfp}>*Ff}tIWO~;;G%3g!o@#ILr&Ik_9V#&9APOr;; zkn*spaPpOt=H%#5d;6wc-k2<0yo9LsuVVFjFGILUTq)if>d|K+YE>L^LeIQ!n=86! zn|gi;@lqq-@xa{wr@cG>hkEKLEimH#d&2vts6yt1hiDQd9a$=Q!Q-IK~02Og zJ?)I&!!a5QsNpJisc-c(B|jpxApieJh@$0E_9}i_RWMf&009sH0T2KI5C8!X009sH z0bUdMAMgL6|DP3;yZ;ZBXWQ`Fmxu9y00@8p2!H?xfB*=900@8p2=J4@xBGtsT%J>r zpiJ2>JKCm9Iw0WaC7pH4s-@mjrwLisgPTqH>-|4HM4)Tz{eQ*K{eS2uJ&a^1LdzsL zZq`kby02YE#$L5%j;q3-MK13nH6zmcNf`6=>^AXQHo?un`zgUQX+d8=xPO?y@&K9l zMuZtRJ5z7fGh1G7(;ce+f25!2S$vFeNK8p+9@5U#n#hS(@1XBmn&wjV`!nCr_iz~vK%Z5ky~1tHx&Bc z^o$z=K%mhklNkqSQNu6)d$9Vb6V;`XWQGzVmm3h!i=Cv&9EhSTJ)zEzS8rIkN8$a? z84?Q8`);+TNs!-Vc`7YODx)%Vbi9OwQ*8z za|Hnq009sH0T2KI5C8!X009u-HG$Fnf1$Oowv-slV9QOH!Vs};dA~fH5E0cUaVOE+ z+LYJy#p%Z^aiJzm%8*dMxJIc}l-gOp?1<09f$37md{>2H!j2Q3Evj`jTR`=Tx5<3g zc%Wv>1CGne2t!UQtz&f^+G)SLb@Uv3|iD1TX(W%<9wm691=I@NeV) z%GwE9T|3m)Y@caMWUhLI; zwX9&WAOHd&00JNY0w4eaAOHd&00KNFFoFI5IQReG?f*wth5mos{C|cY+m6RRJPZc} zKmY_l00ck)1V8`;KmY_lfUg85u>W7QaZLXIclZAY5!o`2SoH;q7MNPf7hIUCbusPi zi+CExPPRxZD^xjIZ`$<1JGj0!vpX3H6xVaK4xBhEEjU)oqy*9n75okxAx zeXj}~dPUvSasG0TZ-hIxqO5(SZbEfWcK8H6+yjHVk=}hI?dppBB zcAv;m)Fr9pS0MxSLm$r#p*=D!mO`460_h)K7f^_ z@BZ8VfAhZA|8GSUG!H2KCR%5I^UD>w5B9b$7 z0Kg<+@~d0}^-X>^6F{_7dTEwNKYi+w`J&nTLrltGVGwh-Rz~veg)<`z1s>mEI2>t8 zE3u8VzA{_@@Usj$cBla09mhL7^+C(X0l>Ovo&HzZAG8~Bv!ZO0a<=Wunz@dlg?gSs z%O=Zmuv3Q*0D49a0P@HT9Yk9%RuF;g!A?iqZT-3jAh$z6J8{}Z?|!7Bu*pxWFfOO* z0XjXkHtjmf^6|HYWH_AF_f7mX&GDAoy&6S6==k{G3IFwCjI%`U4qIHZN@lW`zMz4) zDSIQItt^->2!H?xfB*=900@8p2!H?xfB-KEjPCynt%bFv#8?JfEc$MUdPto!Tqz-H z9)i}4!jN>VUEQ^sawFT^>v}@`_Fk{YC|@qYwggo4?z?0l5|sDK+{RT9Pd9cCeN4DpJ8t(y(=|b zJb0UY|4y}Sc9rTE8;tWjML0EAs%E*Sa~}XW78Q1#xLVM8l&u!{*67sxP&->$5zfBf zES@FJnKC<~<6dP`l(JQbzml|ta?4{Xf^F8A-O^1KLNrP`BTsDcn$@F|saU&AN1o^GWoHB3sb zugdFO=a=glnK9|L>I?7twNHL0SfR{b!%LqX#sUH$00JNY0w4eaAOHd&00JPuX95$r z|5v0T;r{;z@BarP*&Fz5Wx;eo00ck)1V8`;KmY_l00ck)1b9hc?Ee2jUWsV8{KJB4 zg32pqrj%uq?3ww=R(&ElmnGMt4s1|rjJB+lko1jNe8eZH-?(IDdxD6g*vh0^?&;Tm zvzF|{q*+$xD5c%ZYrV36itwj-)1+3{p`G@-TSp(l?QmCc@iKO9P(!q4V*NH*i(24z z%|?Gr^>|sa@34hNZ0LmR38pU18L$LBN{`^j_b|F7PV8Ls~yuK|EKOCjk1hO}(P63NB>um7E$}MS1yh31oz{b6!_5aC3_5V+Z z{=<*{yRnys(*HVpzN-J%N1doHl_WE`j{$nIf%vNB2w&Dn{lDiryPKpvxbxil|DyBU z`v0Jj`hT7D#fDD|hwA^ad6eAUnAZoLUs{gT|DU<%_kvshe?1H8|M~3Cg6V<)2!H?x zfB*=900@8p2!H@@3H&wxKW|L_zeP*Er%n^HtOqxH;{E^VswH!+x%vOG-{${^f64zJ ziU0eY|8J6ID1aD<2~u+XyZnD{{NMjy|39)Pdo^!;cNh%_fB*=900@8p2!H?xfB*=9 z0DlRLbN??WJ%0ZGW2yqY|Np`F|AUj@{Xc*GSTI`<009sH0T2KI5C8!X009u-F@e$h z|F81@ZwcZe8;%{15K>+-J<(+5QiTOM7ZP7Om31%5!_RfzoRdFgvKE%WeAFG(_6i}W zn7TpQL2kA?CNXN(Vm>{V;#xGMZv zpgxW%*3XNgH|Zuqe!h zu3sO&aVzjpw@)LvRj;S3oyTs%SLq_`d$BCydVJM1#NFpaJZftqt&@XwMwPb{g-|L_ ziD(q}<$nO4aFiy;!E%%TziIzBbrr_xEd2ww{hztaQ2W1X;oc=Mt5e_}d5 z$Q?Vjc-mBzMC7KaVYZ7!C-400@8p2!H?xfB*=900{7zz&Q8+ vfA{{M*;)?o|9|lPf6;rkBcH7-m@Wu_00@8p2!H?xfB*=900@8p?+E+{E59u+ literal 0 HcmV?d00001 diff --git a/run/world/region/r.-21540.17735.mca b/run/world/region/r.-21540.17735.mca new file mode 100644 index 0000000000000000000000000000000000000000..4e1de47010c8896f4e63e16cbaa3dfc7d69b84db GIT binary patch literal 315392 zcmeI*e^ib6+Q;#Jp;C6*q#tG{nj*&)_AdA5i3xvP_Z;(y(-p3vBrrNBvyb}TCsw~ znk*JS1Q0*~0R#|0009ILKmY**ep`XX?{6C?cS-#Z<^H$-Isdo+_s!!ibX%+I&qh|N z9eUn8>0dUx!hAs0l4Z@dy>iTEB{&wJo8DNzIG{mU_1IHyIWOmr@dx_nZ5-g->aYM~D(~zcvW9JQx$=&7*Tx}XuYMN)O^SPK&*yi8C%(J&PJ689n5d$n zHN$TR3*1Ud<|J8vnZDz6?BFSd`)eI;J<`U7JiHUVcyo1Ua^~wB%v2R`G|XM!|Lobc zse$EXZ{xL58(Y&c+x4h8H2@iN20IM#o)py)^uQx=C}Pz_3^6EU4{O3$hLIkJTzg z>7~jtU4DR~xkGKPP(D`oRn*>!snBS%4Q(B2OI2&CA?QxbCv%r}Dcvo@$4>K^m+(n) zz~h=3cLO|K^S-kfAPB#|8vee=6iq~8!gZ^^2fX{i#q^I3W;I%uE}Q9J;I*sZzQ#PH z%tZ*2S~fid5I_I{1Q0*~0R#|0009JK6?k#}kNCg*Z+6^v5`}BQ&(Z92K^2MT!NwHrV?)h8a+_5@$Wca=*k&mK} zoOrN1r zTGtkX?XFt^nX_^ef9~4vzH@rqX4^csl=|ekYtokU1+|Al*{&Y1+I^|gPM7bY7;`(OQqFPh0-J=C)8e|u5Kf=AK!ypLVaQ%@T(Y3J-Yd)w-jg5~or zVW_NoWHFidI<^bkM*0R#|0009IL zKmY**5Rg^i#rgkV_y33L&Bgow)Bcn1|1VLsZuw2_|DTv51k1Wdh9iIg0tg_000Iag zfB*srARr}RME)P7@4@^3Ccgjw`PV|A)Eej^fB*srAbo4|4N9cxco8*;Vc8_@vN^oa%ZX&*P`mjmf7w zHXIAFT2=NiVn+P3PfN7l&e67A$nlHwIXuwCu|TW*p-UYogj_REZuZO`Fl2M?;Fs;^ zHe>|em@(_>xiH-byYWuSP{)sjTPVjS4CGG zeX#pvMcZ5M(^7tpDrwjnHPhKj*swmLW%En60}c1;&Nr;{oSyoDhhv0iV^fCW(d*au zHa-YTzp~72{jAR)c8c%+rzOVaTIac>)a&Mn@Bg>P)N8cWm8ph!L7k$}er9O@=iB|e zt1HWroVOcnbon`kb-MgMirSW#WQ}&a!9`H_(p>ORthlrM#`dSqgGy#cwa2cgE6vT$ z2rl=i*^}V(RjOfiiC1Co(AyD<<0`!_mnW63@OzT==Kaa}=~;y}{==@$ziac<{K*I* zMAkhr903FnKmY**5I_I{1Q0*~0Vx3^&j0Q73hw`#c>X`MO7N9h13d%~KmY**5I_I{ z1Q0*~0R&_fFe3k3==+iXP0artzZbk^-6O*hKmY**5I_I{1Q0*~0R#|`5-=kF_tW?0 z{eKhl|Gd4zD5*8jLjVB;5I_I{1Q0*~0R#|0Kvn@G^1rj*hWu}0{(rxRFhP0auIb_iZlYoLb!0tg_000IagfB*srAb^0Z z0!HM2SG_g)-^BdCB7^gPS)XHuBY*$`2q1s}0tg_000Ia|3mB3A`{?_S|4q#QW0nge zq!&RK0R#|0009ILKmY**5I_I{83l~U|AX~by#H@v{@=Sqctyr7G8zE{5I_I{1Q0*~ z0R#|000C(MBl3Swy(8!UCgy+Z3SpS^BIqK300IagfB*srAb}Ijy~9ZvZC!R_h~6VN0l^e zjhg9fC2Uw9(X#m^+ku9Ab>|z_c}`FLz{4@Zv#}{d@#yvIdmA5wrC(X*wtm*<4?DZ| zyQd|_Yy=ci{C*7y&*I{&WCQ}edf!UX9>&_w_N1Q0*~0R#|0 z009ILKtM(TBhLS=^h(bEO+5d%3F7|0j88G65kLR|1Q0*~0R#|0009JEBw$4TAE@s| z{x>oIuZt1JzGxNn5kLR|1Q0*~0R#|0009ILkWIjd{BNsw;QN0j=6{uwFkH4BG8h2_ z5I_I{1Q0*~0R#|00D%_?7?J<~_xu0x2m0r29N^sQv{2LZw9}B9T|eH&$38MD@9ZD4 zhHZ1X@{V@b#vx&^eir{tihFC%=XZlAzPt5Kd#vY}sG_1Z!*2)++)7I3Bw2r%zT-&zK%Oa$6a#0H2i?NNpqpVuvh0SsO?n?vJLT%)hb2lrOGm0et@F6Lv5~5K34Zt z)ZU7z&}g#_Z5?V$Rcopt=uXThbC-50-7Uk%nwbBUcLkppt%5!R2q1s}0tg_000Iag zfB*ur2^f+8z4R8G|C^ZqOACY`*>=ca1Q0*~0R#|0009ILKmY**UL;^d{&&>d@&3Pw z`Tw;pLH(jt&_@6P1Q0*~0R#|0009ILKtMJDBl5qq-iGsk6Z8L~>%wT+cF14^5I_I{ z1Q0*~0R#|0009JEBw$4Tx7PRN{NKdbWr82)pr4%23CZ+cK^IjW>#Yt&3h?dPS*$y<^t2^JY&U1R|2Of?Qo{dcz zibtRy@)9*PxrmfzU^)Ok?J?5OtG z6?LV#*%`s*9yNOsoW4pmtS<2?>>YYLVsTuh*X8o0(iMJBvfjKuIX^wCu*QGb)%kaA zo|^wqBaD}Ei;PA90R#|0009ILKmY**5I{g$z=-pImA)tE|0bUQ|5+gfNH2me0tg_0 z00IagfB*srAb;Me^B|Nj2}+W+M5|IhAFH~lu>|F10~|I7FkGa3N|5I_I{1Q0*~0R#|0;6(yP zoc|Bf_Ylwjryb~@w{d`TtJ6YF)6-5vYIgm28z1|~sJyd($QriI<;pwST^omlz4}@F zH!1F|J)hqVp7`$8JMFQaW1@Fn;7#(-X_0sSI z>LseyErz{1XF+YRT99psf2>w1N-tHG>GA^<%^hlUh4QhwucG!=Ooc|9ZD{LITdG=9 z4MBHeKAF3;OX+SIKGwwZ|Ic#x{{M>}MfwOJfB*srAb}(j$$Intz=-pIE4`BQe-qFDySs&$oU*%eX~GBY*$`2q1s}0tg_000IagAT3}-{(XU2{R_Ny72MaD zhYSl7e5KYv4*>)aKmY**5I_I{1Q0*~0a*o%$p2n?3-Z5-=l>^83&FDPk>Lm+fB*sr zAb(S|C^ZqKPnacW!)pg5kLR|1Q0*~0R#|0009ILkPI)`DJD==c@QzU+>Z0 zlcu_Ub;y3?ksbSg%rgj4&J`nzKlUsL?$h`AMgPv`$rp<@CdGbfxaV(ubI0o3k>UHM zL_Uf>a^k`6kYjDz-+k2i@Mv^Lk9P{iw%g_$pXKBFy<%6hWMio^qQI;%s_4@x6(>iy z|8V%gYh7Cmw!3ZxWX{S>{JCqt`_Accn{D&lQtFfEu1SA(JLW`Eeu2SUQF}Y)16_WA zqPbmtOrtdz+8(PXD3pTQL!oR}k5}!!RB5Nn_fU+v9n-1H*Q;7jwHyg)A2qS=K+&fy ze_!2qrY5Lp4eMXE_Ul?&wccT4)!rXn^A04Az z2EOC7X`R!U;88_?S?e>xJ7cX^ZN|^Res=%J4n8#~GHZTNZqTr(E2r`jbqDQNzWJqQ z?WS)o>x24x*3`Y1DSWv5pnKqQufrFVDdWS7L(LT3S*tu^CoNAdKJ-&!V0XjxUsk1* ze|TwE!N{S?U7==8XVymN-q>*}CUait)@@U+Sl!z=I4}H4cj7Z)fBLrXn>5iw?aM>= z{VCyC(}&&8iLU3P_x$a8X??S;?}Y)1j_)e#G~%oMPKwgX%CaQqY(qm!Ot40~$5kb?@;&hEAL*HZC;r1a-Q$C-&wjnTePpYo8yLa zch~gRJuO~5Bv|RGDhdclun5}{m{R;|NJI7hwX-XRx_)h$u@Q{A8J6GEi6Ko0=~ z5I_I{1Q0*~0R#|000DUgj5z=I(wKAq-^Ba>XP@x>e|aBdrXzp=0tg_000IagfB*sr zND3H{{|6nnApe_~|M&iv@QUOfXd-|B0tg_000IagfB*srARwoJ5&7TwIN$#>_5J_V zqXmCC*T`%H5I_I{1Q0*~0R#|0009If1&ql5PMRK^|C@OJ|NdHGjN~3@B7gt_2q1s} z0tg_000IagAg6#4`QPq%FY>>M`9DM@_{q6OW+Q+A0tg_000IagfB*srARsAVME>_Y z&iDUJz5jo5vJfn}2bu^VfB*srAbxTVLqU0$+BkKUO8s75*&-qMKsng4rowT zJyy?63SFB1_HdsOBh?p1T-2Rtf1ogT-}XnxXqSQS_-tC|G$wdd(O=g3jPTA_>s6ca zbFiP?KeB^Q4T{W~ACwz3Eb7XsyhPnW`;~8gsad<}o6Gv3{+=~;?_~-f?mp-qxZLaT z1!c>$1%YGhWW~z4kjxw`Ys?^>%aIaPID!-nys7i-!a&Jyk^k0SOjiTLM#x zUkz!f-oJKs#ZcGpu1uX?{&}kVFLQ*6l53!e00IagfB*srAbt_kO}~S@+0r1Q0*~0R#|0009ILKmY** zqy&t}{|?8w|8MH||DuxxwbUBuA%Fk^2q1s}0tg_000IagAgh28`QPd|=l`bW|9%Su zA6fUva0C!Q009ILKmY**5I_I{1f&Fv`2N4|-}wH&iQoTkdoE0n+5$ZU5I_I{1Q0*~ O0R#|0009K#6!>q4QBk}A literal 0 HcmV?d00001 diff --git a/run/world/region/r.-21540.17736.mca b/run/world/region/r.-21540.17736.mca new file mode 100644 index 0000000000000000000000000000000000000000..0b2f16eef3779c728817b7ecc319a38536d552d5 GIT binary patch literal 2772992 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 z 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 literal 0 HcmV?d00001 diff --git a/run/world/region/r.0.-1.mca b/run/world/region/r.0.-1.mca new file mode 100644 index 0000000000000000000000000000000000000000..9a5ea3acef1cd95e0755736509e8dfb0a8584977 GIT binary patch literal 868352 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̹?QJ%olU!j4g{g+*-6I@U$5r> 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 z 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 W1V8`;KmY_l00ck)1VG@25cq%Q7P-U# literal 0 HcmV?d00001 diff --git a/run/world/region/r.0.0.mca b/run/world/region/r.0.0.mca new file mode 100644 index 0000000000000000000000000000000000000000..5501eaa2ab6f97fb551c8d86ffc4a3033e893e78 GIT binary patch literal 929792 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 z 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/config/. +If the config being transferred is in a subfolder of the base config folder make sure to include that folder here in the path to the file you are overwriting. +For example if you are overwriting a config with the path /config/ExampleMod/config-server.toml, you would need to put it in serverconfig/ExampleMod/config-server.toml diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputFluidManager.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputFluidManager.java index 9963fa3..ac746c7 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputFluidManager.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputFluidManager.java @@ -91,7 +91,6 @@ public List getBlocksPosition(Level level) { List positions = new ArrayList<>(); for (BlockPos p : this.getBlocksPosition()) { - CreateNuclear.LOGGER.warn("getBlocksPosition: {} {}", level.getBlockEntity(p), level.getBlockEntity(p) instanceof ReactorFluidInputEntity); if (level.getBlockEntity(p) instanceof ReactorFluidInputEntity) positions.add(p); } return List.copyOf(positions); @@ -126,8 +125,7 @@ public VirtualReactorInputFluid getInventory(Level level) { if (handlers.isEmpty()) return new VirtualReactorInputFluid(); for (IFluidHandler h : handlers) { - int tank = h.getTanks(); - virtualReactorInputFluid.addFluid(h.getFluidInTank(tank)); + virtualReactorInputFluid.addFluid(h.getFluidInTank(0)); } return virtualReactorInputFluid; @@ -145,8 +143,7 @@ public boolean extractFluids(Level level, int fluidNeeded) { if (handlers.isEmpty()) return false; for (IFluidHandler handler : handlers) { - int tank = handler.getTanks(); - FluidStack stack = handler.getFluidInTank(tank); + FluidStack stack = handler.getFluidInTank(0); if (stack.isEmpty()) continue; int toExtract = Math.min(fluidNeeded, stack.getAmount()); if (toExtract > 1) { diff --git a/src/main/java/net/nuclearteam/createnuclear/gametest/DefaultHeatCalculatorGameTest.java b/src/main/java/net/nuclearteam/createnuclear/gametest/DefaultHeatCalculatorGameTest.java new file mode 100644 index 0000000..f95125c --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/gametest/DefaultHeatCalculatorGameTest.java @@ -0,0 +1,246 @@ +package net.nuclearteam.createnuclear.gametest; + +import net.minecraft.core.BlockPos; +import net.minecraft.gametest.framework.GameTest; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.gametest.GameTestHolder; +import net.neoforged.neoforge.gametest.PrefixGameTestTemplate; +import net.nuclearteam.createnuclear.CNBlocks; +import net.nuclearteam.createnuclear.CNDataComponents; +import net.nuclearteam.createnuclear.CNItems; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.PatternData; +import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintData; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerInventory; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorDisplayState; +import net.nuclearteam.createnuclear.content.multiblock.reactorLogic.DefaultHeatCalculator; +import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; + +import java.util.List; +import java.util.Map; + +/** + * GameTest coverage for {@link DefaultHeatCalculator#computeHeat}, run against a real + * {@code ServerLevel}, a real {@link ReactorControllerBlockEntity} and real registered + * rod items (no mocks) — plain JUnit cannot exercise this method at all: {@code Item}, + * {@code ItemStack} and {@code RodType} resolution all depend on Minecraft/NeoForge registries + * that only exist once the game has bootstrapped. + *

+ * All tests share the "empty_platform" structure and place a single + * {@code CNBlocks.REACTOR_CONTROLLER} to obtain a real {@link ReactorControllerInventory}. + * The reactor pattern (57 slots, indices per {@code DefaultHeatCalculator.FORMATTED_PATTERN}) + * is written into the blueprint's {@link ReactorBluePrintData} component and set into inventory + * slot 0, exactly as {@code ReactorBluePrintItem.getItemStorage} reads it back. + *

+ * This is where the port diverges from Forge: Forge writes the pattern into the blueprint's + * raw {@code pattern} NBT tag, which has no NeoForge equivalent since the blueprint carries a + * typed data component instead. + *

+ * Expected heat values are computed from the live {@code CNConfigs.server().rods} values + * rather than hardcoded, so these tests stay correct if the mod's default balance changes. + */ +@GameTestHolder(CreateNuclear.MOD_ID) +@PrefixGameTestTemplate(false) +public class DefaultHeatCalculatorGameTest { + + private static final String STRUCTURE = "empty_platform"; + private static final double DELTA = 1e-9; + private static final int PATTERN_SLOTS = 57; + + // ---------- test fixtures ---------- + + private static ReactorControllerInventory placeController(GameTestHelper helper, BlockPos rel) { + helper.setBlock(rel, CNBlocks.REACTOR_CONTROLLER.get().defaultBlockState()); + ReactorControllerBlockEntity be = (ReactorControllerBlockEntity) helper.getBlockEntity(rel); + return be.getInventoryObject(); + } + + /** + * Writes {@code rodsBySlot} into the blueprint's {@link ReactorBluePrintData} component and + * loads it into slot 0. Every one of the 57 slots must be present, since + * {@code ReactorBluePrintItem.getItemStorage} bails out on a shorter array. + */ + private static void loadPattern(ReactorControllerInventory inventory, Map rodsBySlot) { + PatternData[] pattern = new PatternData[PATTERN_SLOTS]; + for (int slot = 0; slot < PATTERN_SLOTS; slot++) { + Item rod = rodsBySlot.get(slot); + pattern[slot] = new PatternData(slot, rod == null ? ItemStack.EMPTY : new ItemStack(rod)); + } + + ItemStack blueprint = new ItemStack(CNItems.REACTOR_BLUEPRINT.get()); + blueprint.set(CNDataComponents.REACTOR_BLUE_PRINT_DATA, + new ReactorBluePrintData(0, 0, 0, 0, pattern, pattern)); + inventory.setStackInSlot(0, blueprint); + } + + private static final DefaultHeatCalculator CALCULATOR = new DefaultHeatCalculator(); + + // ================================================================ + // 1. single fuel rod, no neighbors + // ================================================================ + + @GameTest(template = STRUCTURE) + public static void singleFuelRod_noNeighbors_addsOnlyItsOwnBaseRodHeat(GameTestHelper helper) { + Item thorium = CNItems.THORIUM_ROD.get(); + int baseRodHeat = CNConfigs.server().rods.baseValueThorium.get(); + + ReactorControllerInventory inventory = placeController(helper, new BlockPos(1, 1, 1)); + // slot 18: middle row, no adjacent slot populated -> no neighbor bonus possible + loadPattern(inventory, Map.of(18, thorium)); + + ReactorDisplayState displayState = new ReactorDisplayState(Map.of(thorium, 1), List.of(), 0); + double overHeat = 10.0; + + double heat = CALCULATOR.computeHeat(null, null, inventory, overHeat, displayState, helper.getLevel()); + + helper.assertTrue(Math.abs(heat - (baseRodHeat + overHeat)) < DELTA, + "an isolated fuel rod should only contribute its own baseRodHeat, plus overHeat: expected " + + (baseRodHeat + overHeat) + ", got " + heat); + helper.succeed(); + } + + // ================================================================ + // 2. single cooler rod, no neighbors + // ================================================================ + + @GameTest(template = STRUCTURE) + public static void singleCoolerRod_noNeighbors_addsOnlyItsOwnBaseRodHeat(GameTestHelper helper) { + Item graphite = CNItems.GRAPHITE_ROD.get(); + int baseRodHeat = CNConfigs.server().rods.graphiteBaseValue.get(); + + ReactorControllerInventory inventory = placeController(helper, new BlockPos(1, 1, 1)); + loadPattern(inventory, Map.of(18, graphite)); + + ReactorDisplayState displayState = new ReactorDisplayState(Map.of(graphite, 1), List.of(), 0); + + // computeHeat clamps its result to a minimum of 0 (Math.max(0, heat+overHeat)); an isolated + // cooler's own baseRodHeat is negative by default, so a large overHeat is added here to keep + // the total positive and actually observe baseRodHeat's contribution instead of it being + // swallowed by the floor. + double overHeat = 50.0; + + double heat = CALCULATOR.computeHeat(null, null, inventory, overHeat, displayState, helper.getLevel()); + + helper.assertTrue(Math.abs(heat - (baseRodHeat + overHeat)) < DELTA, + "a cooler contributes its own baseRodHeat exactly like a fuel rod would, when isolated: expected " + + (baseRodHeat + overHeat) + ", got " + heat); + helper.succeed(); + } + + // ================================================================ + // 3. fuel/cooler mix adjacency: cooler scans its own fuel neighbors symmetrically + // to a fuel rod, matching the wiki calculator / external spec + // ("Graphite extra: -1/4Q of the heating rod") + // ================================================================ + + /** + * Layout (row 3 of {@code FORMATTED_PATTERN}, three consecutive slots): + * uranium A (18) - thorium B (19) - graphite C (20). + *

+ * Expected total = sum of each rod's own baseRodHeat, PLUS proximity contributions from + * both fuel-fuel and cooler-fuel adjacency (cooler-cooler and fuel-cooler-from-the-fuel-side + * contribute nothing): + *

    + *
  • A's scan (fuel, neighbor B is fuel) -> + A.proximityRodHeat()
  • + *
  • B's scan (fuel, neighbor A is fuel) -> + B.proximityRodHeat()
  • + *
  • B's scan (fuel, neighbor C is cooler) -> contributes nothing (fuel only scores against fuel neighbors)
  • + *
  • C's scan (cooler, neighbor B is fuel) -> + B.baseRodHeat() * C.proximityRodHeat()
  • + *
+ */ + @GameTest(template = STRUCTURE) + public static void fuelCoolerMix_coolerScansItsOwnFuelNeighborsSymmetrically(GameTestHelper helper) { + Item uranium = CNItems.URANIUM_ROD.get(); + Item thorium = CNItems.THORIUM_ROD.get(); + Item graphite = CNItems.GRAPHITE_ROD.get(); + + int uraniumBase = CNConfigs.server().rods.uraniumBaseValue.get(); + float uraniumProxy = CNConfigs.server().rods.uraniumProximityBonus.get(); + int thoriumBase = CNConfigs.server().rods.baseValueThorium.get(); + float thoriumProxy = CNConfigs.server().rods.thoriumProxyBonus.get(); + int graphiteBase = CNConfigs.server().rods.graphiteBaseValue.get(); + float graphiteProxy = CNConfigs.server().rods.graphiteProximityMalus.getF(); + + ReactorControllerInventory inventory = placeController(helper, new BlockPos(1, 1, 1)); + loadPattern(inventory, Map.of(18, uranium, 19, thorium, 20, graphite)); + + ReactorDisplayState displayState = new ReactorDisplayState( + Map.of(uranium, 1, thorium, 1, graphite, 1), List.of(), 0); + + double heat = CALCULATOR.computeHeat(null, null, inventory, /*overHeat*/ 0.0, displayState, helper.getLevel()); + + double expected = (uraniumBase + thoriumBase + graphiteBase) // each rod's own baseRodHeat + + uraniumProxy // A's scan: fuel neighbor B (thorium) -> addition + + thoriumProxy // B's scan: fuel neighbor A (uranium) -> addition + + (thoriumBase * graphiteProxy); + // C's scan: fuel neighbor B (thorium) -> multiplication (neighbor's base * cooler's own proximity) + // B's scan towards C contributes 0: fuel only scores against fuel neighbors + + helper.assertTrue(Math.abs(heat - expected) < DELTA, + "cooler must score its own malus against its fuel neighbor: expected " + + expected + ", got " + heat); + helper.succeed(); + } + + // ================================================================ + // 4. 3x3 diamond of rods: cross-checked against the community wiki calculator + // ================================================================ + + /** + * Layout (rows 3-5, columns 3-5 of {@code FORMATTED_PATTERN} — a fully interior 3x3 block, + * every position outside it stays empty so neighbor counts match an isolated 3x3 grid): + *
+     * graphite(18) thorium(19) graphite(20)
+     * thorium(27)  uranium(28) thorium(29)
+     * graphite(36) thorium(37) graphite(38)
+     * 
+ * With the mod's default balance values this totals {@code 128}, matching the value produced + * by the community wiki calculator for the same pattern — but the assertion below is derived + * from the live config, not hardcoded, so it stays correct if the default balance changes: + *
    + *
  • 4 corner graphites, each with 2 thorium neighbors -> + * {@code graphiteBase + 2 * (thoriumBase * graphiteProxy)} each
  • + *
  • 4 edge thoriums, each with 2 graphite neighbors (ignored, cooler) + 1 uranium neighbor (fuel) -> + * {@code thoriumBase + thoriumProxy} each
  • + *
  • 1 center uranium, with 4 thorium neighbors (all fuel) -> + * {@code uraniumBase + 4 * uraniumProxy}
  • + *
+ */ + @GameTest(template = STRUCTURE) + public static void threeByThreeDiamond_matchesWikiCalculatorReferenceValue(GameTestHelper helper) { + Item uranium = CNItems.URANIUM_ROD.get(); + Item thorium = CNItems.THORIUM_ROD.get(); + Item graphite = CNItems.GRAPHITE_ROD.get(); + + int uraniumBase = CNConfigs.server().rods.uraniumBaseValue.get(); + float uraniumProxy = CNConfigs.server().rods.uraniumProximityBonus.get(); + int thoriumBase = CNConfigs.server().rods.baseValueThorium.get(); + float thoriumProxy = CNConfigs.server().rods.thoriumProxyBonus.get(); + int graphiteBase = CNConfigs.server().rods.graphiteBaseValue.get(); + float graphiteProxy = CNConfigs.server().rods.graphiteProximityMalus.getF(); + + ReactorControllerInventory inventory = placeController(helper, new BlockPos(1, 1, 1)); + loadPattern(inventory, Map.ofEntries( + Map.entry(18, graphite), Map.entry(19, thorium), Map.entry(20, graphite), + Map.entry(27, thorium), Map.entry(28, uranium), Map.entry(29, thorium), + Map.entry(36, graphite), Map.entry(37, thorium), Map.entry(38, graphite) + )); + + ReactorDisplayState displayState = new ReactorDisplayState( + Map.of(uranium, 1, thorium, 4, graphite, 4), List.of(), 0); + + double heat = CALCULATOR.computeHeat(null, null, inventory, /*overHeat*/ 0.0, displayState, helper.getLevel()); + + double cornerGraphite = graphiteBase + 2 * (thoriumBase * graphiteProxy); + double edgeThorium = thoriumBase + thoriumProxy; + double centerUranium = uraniumBase + 4 * uraniumProxy; + double expected = 4 * cornerGraphite + 4 * edgeThorium + centerUranium; + + helper.assertTrue(Math.abs(heat - expected) < DELTA, + "3x3 diamond should match the wiki calculator's reference value for this pattern: expected " + + expected + " (128 with default balance), got " + heat); + helper.succeed(); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/gametest/ReactorInputFluidManagerGameTest.java b/src/main/java/net/nuclearteam/createnuclear/gametest/ReactorInputFluidManagerGameTest.java new file mode 100644 index 0000000..516b163 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/gametest/ReactorInputFluidManagerGameTest.java @@ -0,0 +1,498 @@ +package net.nuclearteam.createnuclear.gametest; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.gametest.framework.GameTest; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Fluids; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.capability.IFluidHandler; +import net.neoforged.neoforge.fluids.capability.IFluidHandler.FluidAction; +import net.neoforged.neoforge.gametest.GameTestHolder; +import net.neoforged.neoforge.gametest.PrefixGameTestTemplate; +import net.nuclearteam.createnuclear.CNBlocks; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputFluidManager; +import net.nuclearteam.createnuclear.content.multiblock.input.fluid.ReactorFluidInputEntity; +import net.nuclearteam.createnuclear.content.multiblock.input.fluid.VirtualReactorInputFluid; +import net.nuclearteam.createnuclear.foundation.block.MultiDirectionalReactorBlock; + +import java.util.List; + +/** + * GameTest coverage for {@link ReactorInputFluidManager}, run against a real + * {@code ServerLevel} and real {@link ReactorFluidInputEntity} blocks (no mocks). + *

+ * All tests share the "empty_platform" structure + * (data/createnuclear/structure/empty_platform.nbt): a 5x3x5 area with a + * stone floor at y=0, leaving y=1..2 free to place fluid input blocks. The structure + * is a real compressed structure-block export (a hand-authored .snbt cannot be loaded + * directly here). Note the folder is {@code structure}, singular: 1.21 renamed the + * data folders that Forge 1.20.1 spelled {@code structures}. + *

+ * Capability access goes through {@code level.getCapability(Capabilities.FluidHandler.BLOCK, ...)} + * instead of Forge's {@code be.getCapability(ForgeCapabilities.FLUID_HANDLER)}, and fluid ids are + * resolved via {@code BuiltInRegistries.FLUID} instead of {@code ForgeRegistries.FLUIDS}. + *

+ * Tests named "*_expectedContract" assert the documented/intended behavior of + * extractFluids and are EXPECTED TO FAIL against the current implementation + * (fluidNeeded is never decremented between handlers, and a request for exactly + * one unit is silently dropped). They act as regression markers for the future fix, + * and fail identically on the Forge branch. Tests named + * "*_currentBehavior"/"*_characterization" assert what the code does today and should + * keep passing until that fix lands. + */ +@GameTestHolder(CreateNuclear.MOD_ID) +@PrefixGameTestTemplate(false) +public class ReactorInputFluidManagerGameTest { + + private static final String STRUCTURE = "empty_platform"; + + // ---------- test fixtures ---------- + + private static void place(GameTestHelper helper, BlockPos rel, Direction facing) { + helper.setBlock(rel, CNBlocks.REACTOR_FLUID_INPUT.get().defaultBlockState() + .setValue(MultiDirectionalReactorBlock.FACING, facing)); + } + + private static IFluidHandler handler(GameTestHelper helper, BlockPos rel) { + return helper.getLevel().getCapability(Capabilities.FluidHandler.BLOCK, helper.absolutePos(rel), null); + } + + private static void fill(GameTestHelper helper, BlockPos rel, FluidStack stack) { + IFluidHandler h = handler(helper, rel); + if (h != null) h.fill(stack, FluidAction.EXECUTE); + } + + private static int tankAmount(GameTestHelper helper, BlockPos rel) { + IFluidHandler h = handler(helper, rel); + return h == null ? -1 : h.getFluidInTank(0).getAmount(); + } + + private static ReactorInputFluidManager manager(GameTestHelper helper, BlockPos... relPositions) { + ReactorInputFluidManager manager = new ReactorInputFluidManager(); + for (BlockPos rel : relPositions) manager.addBlock(helper.absolutePos(rel)); + return manager; + } + + // ================================================================ + // read / write (pure NBT, no world interaction required) + // ================================================================ + + @GameTest(template = STRUCTURE) + public static void read_absentKey_leavesEmpty(GameTestHelper helper) { + ReactorInputFluidManager manager = new ReactorInputFluidManager(); + manager.read(new CompoundTag()); + + helper.assertTrue(manager.size() == 0, "expected no tracked positions when NBT key is absent"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void read_clearsPreviousPositions(GameTestHelper helper) { + ReactorInputFluidManager manager = new ReactorInputFluidManager(); + manager.addBlock(new BlockPos(1, 2, 3)); + + manager.read(new CompoundTag()); + + helper.assertTrue(manager.size() == 0, "read() must clear previously tracked positions before loading"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void read_singleEntry_roundTrips(GameTestHelper helper) { + CompoundTag entry = new CompoundTag(); + entry.putInt("x", 5); + entry.putInt("y", 64); + entry.putInt("z", -3); + ListTag list = new ListTag(); + list.add(entry); + CompoundTag root = new CompoundTag(); + root.put("ReactorInputFluid", list); + + ReactorInputFluidManager manager = new ReactorInputFluidManager(); + manager.read(root); + + helper.assertTrue(manager.size() == 1, "expected exactly one entry after read"); + helper.assertTrue(manager.contains(new BlockPos(5, 64, -3)), "expected BlockPos(5,64,-3) to be present"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void read_multipleEntries_preservesOrder(GameTestHelper helper) { + BlockPos a = new BlockPos(0, 0, 0); + BlockPos b = new BlockPos(1, 1, 1); + BlockPos c = new BlockPos(2, 2, 2); + + ListTag list = new ListTag(); + for (BlockPos p : List.of(a, b, c)) { + CompoundTag entry = new CompoundTag(); + entry.putInt("x", p.getX()); + entry.putInt("y", p.getY()); + entry.putInt("z", p.getZ()); + list.add(entry); + } + CompoundTag root = new CompoundTag(); + root.put("ReactorInputFluid", list); + + ReactorInputFluidManager manager = new ReactorInputFluidManager(); + manager.read(root); + + helper.assertTrue(manager.getBlocksPosition().equals(List.of(a, b, c)), + "expected insertion order to be preserved, found " + manager.getBlocksPosition()); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void write_emptyPositions_stillWritesKey(GameTestHelper helper) { + CompoundTag tag = new CompoundTag(); + new ReactorInputFluidManager().write(tag); + + helper.assertTrue(tag.contains("ReactorInputFluid"), "write() should always write the NBT key, even when empty"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void write_then_read_roundTrip(GameTestHelper helper) { + BlockPos a = new BlockPos(1, 2, 3); + BlockPos b = new BlockPos(-5, 64, 100); + + ReactorInputFluidManager original = new ReactorInputFluidManager(); + original.addBlock(a); + original.addBlock(b); + + CompoundTag tag = new CompoundTag(); + original.write(tag); + + ReactorInputFluidManager restored = new ReactorInputFluidManager(); + restored.read(tag); + + helper.assertTrue(restored.getBlocksPosition().equals(List.of(a, b)), + "round-trip through NBT should preserve exact positions and order"); + helper.succeed(); + } + + // ================================================================ + // clearInvalid + // ================================================================ + + @GameTest(template = STRUCTURE) + public static void clearInvalid_missingBlockEntity_removesPosition(GameTestHelper helper) { + BlockPos rel = new BlockPos(1, 1, 1); // never placed: air, no block entity + ReactorInputFluidManager manager = manager(helper, rel); + + manager.clearInvalid(helper.getLevel()); + + helper.assertTrue(manager.size() == 0, "a position without a block entity should be removed"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void clearInvalid_noCapability_removesPosition(GameTestHelper helper) { + BlockPos rel = new BlockPos(1, 1, 1); + helper.setBlock(rel, Blocks.CHEST.defaultBlockState()); // real BE, no fluid capability + ReactorInputFluidManager manager = manager(helper, rel); + + manager.clearInvalid(helper.getLevel()); + + helper.assertTrue(manager.size() == 0, "a block entity without a fluid capability should be removed"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void clearInvalid_validCapability_keepsPosition(GameTestHelper helper) { + BlockPos rel = new BlockPos(1, 1, 1); + place(helper, rel, Direction.NORTH); + ReactorInputFluidManager manager = manager(helper, rel); + + manager.clearInvalid(helper.getLevel()); + + helper.assertTrue(manager.size() == 1, "a valid ReactorFluidInputEntity should be kept"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void clearInvalid_mixedSet_onlyInvalidRemoved(GameTestHelper helper) { + BlockPos valid = new BlockPos(1, 1, 1); + BlockPos chest = new BlockPos(3, 1, 1); + BlockPos missing = new BlockPos(1, 1, 3); + + place(helper, valid, Direction.NORTH); + helper.setBlock(chest, Blocks.CHEST.defaultBlockState()); + + ReactorInputFluidManager manager = manager(helper, valid, chest, missing); + manager.clearInvalid(helper.getLevel()); + + helper.assertTrue(manager.getBlocksPosition().equals(List.of(helper.absolutePos(valid))), + "only the valid fluid input position should remain, found " + manager.getBlocksPosition()); + helper.succeed(); + } + + // ================================================================ + // getBlocksPosition(Level) + // ================================================================ + + @GameTest(template = STRUCTURE) + public static void getBlocksPosition_filtersNonMatchingEntityType(GameTestHelper helper) { + BlockPos validRel = new BlockPos(1, 1, 1); + BlockPos otherRel = new BlockPos(3, 1, 1); + place(helper, validRel, Direction.NORTH); + helper.setBlock(otherRel, Blocks.CHEST.defaultBlockState()); + + ReactorInputFluidManager manager = manager(helper, validRel, otherRel); + + List result = manager.getBlocksPosition(helper.getLevel()); + + helper.assertTrue(result.equals(List.of(helper.absolutePos(validRel))), + "only the ReactorFluidInputEntity position should be returned, found " + result); + helper.succeed(); + } + + // ================================================================ + // getFuildHandlers + // ================================================================ + + @GameTest(template = STRUCTURE) + public static void getFuildHandlers_capabilityPresent_included(GameTestHelper helper) { + BlockPos rel = new BlockPos(1, 1, 1); + place(helper, rel, Direction.NORTH); + fill(helper, rel, new FluidStack(Fluids.WATER, 500)); + + List handlers = manager(helper, rel).getFuildHandlers(helper.getLevel()); + + helper.assertTrue(handlers.size() == 1, "expected exactly one handler"); + helper.assertTrue(handlers.get(0).getFluidInTank(0).getAmount() == 500, + "handler should expose the filled tank content"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void getFuildHandlers_preservesTrackingOrder(GameTestHelper helper) { + BlockPos rel1 = new BlockPos(1, 1, 1); + BlockPos rel2 = new BlockPos(3, 1, 1); + place(helper, rel1, Direction.NORTH); + place(helper, rel2, Direction.NORTH); + fill(helper, rel1, new FluidStack(Fluids.WATER, 100)); + fill(helper, rel2, new FluidStack(Fluids.LAVA, 200)); + + List handlers = manager(helper, rel1, rel2).getFuildHandlers(helper.getLevel()); + + helper.assertTrue(handlers.size() == 2, "expected two handlers"); + helper.assertTrue(handlers.get(0).getFluidInTank(0).getFluid() == Fluids.WATER, + "first handler should be the water tank (matches insertion order)"); + helper.assertTrue(handlers.get(1).getFluidInTank(0).getFluid() == Fluids.LAVA, + "second handler should be the lava tank (matches insertion order)"); + helper.succeed(); + } + + // ================================================================ + // getInventory + // ================================================================ + + @GameTest(template = STRUCTURE) + public static void getInventory_noHandlers_returnsEmpty(GameTestHelper helper) { + VirtualReactorInputFluid inventory = new ReactorInputFluidManager().getInventory(helper.getLevel()); + + helper.assertTrue(inventory.fluids().isEmpty(), "expected an empty inventory with no tracked handlers"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void getInventory_aggregatesAcrossHandlers(GameTestHelper helper) { + BlockPos rel1 = new BlockPos(1, 1, 1); + BlockPos rel2 = new BlockPos(3, 1, 1); + place(helper, rel1, Direction.NORTH); + place(helper, rel2, Direction.NORTH); + fill(helper, rel1, new FluidStack(Fluids.WATER, 300)); + fill(helper, rel2, new FluidStack(Fluids.WATER, 250)); + + VirtualReactorInputFluid inventory = manager(helper, rel1, rel2).getInventory(helper.getLevel()); + + ResourceLocation waterId = BuiltInRegistries.FLUID.getKey(Fluids.WATER); + long total = inventory.getAmount(waterId); + helper.assertTrue(total == 550, "expected aggregated total of 550, found " + total); + helper.succeed(); + } + + // ================================================================ + // extractFluids — core of the audited bug + // ================================================================ + + @GameTest(template = STRUCTURE) + public static void extractFluids_nullLevel_returnsFalse(GameTestHelper helper) { + boolean result = new ReactorInputFluidManager().extractFluids(null, 10); + helper.assertTrue(!result, "extractFluids should return false for a null level"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void extractFluids_noHandlers_returnsFalse(GameTestHelper helper) { + boolean result = new ReactorInputFluidManager().extractFluids(helper.getLevel(), 10); + helper.assertTrue(!result, "extractFluids should return false when there are no handlers"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void extractFluids_singleHandlerEnoughStock_drainsExactAmount(GameTestHelper helper) { + BlockPos rel = new BlockPos(1, 1, 1); + place(helper, rel, Direction.NORTH); + fill(helper, rel, new FluidStack(Fluids.WATER, 1000)); + + boolean result = manager(helper, rel).extractFluids(helper.getLevel(), 400); + + helper.assertTrue(result, "extraction should succeed when enough fluid is available"); + helper.assertTrue(tankAmount(helper, rel) == 600, "expected 600 remaining, found " + tankAmount(helper, rel)); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void extractFluids_singleHandlerInsufficientStock_drainsAvailable(GameTestHelper helper) { + BlockPos rel = new BlockPos(1, 1, 1); + place(helper, rel, Direction.NORTH); + fill(helper, rel, new FluidStack(Fluids.WATER, 30)); + + boolean result = manager(helper, rel).extractFluids(helper.getLevel(), 100); + + helper.assertTrue(result, "extraction should be reported successful even for a partial drain"); + helper.assertTrue(tankAmount(helper, rel) == 0, "all 30 available units should have been drained"); + helper.succeed(); + } + + /** + * Characterizes the CURRENT (buggy) behavior: "if (toExtract > 1)" silently ignores + * a request for exactly 1 unit. This test PASSES today. + */ + @GameTest(template = STRUCTURE) + public static void extractFluids_needOfOne_isSilentlyIgnored_currentBehavior(GameTestHelper helper) { + BlockPos rel = new BlockPos(1, 1, 1); + place(helper, rel, Direction.NORTH); + fill(helper, rel, new FluidStack(Fluids.WATER, 5)); + + boolean result = manager(helper, rel).extractFluids(helper.getLevel(), 1); + + helper.assertTrue(!result, "current implementation ignores single-unit extraction requests"); + helper.assertTrue(tankAmount(helper, rel) == 5, "tank should be untouched: the toExtract>1 guard blocks the drain"); + helper.succeed(); + } + + /** + * Asserts the intended contract: a request for exactly 1 unit with stock available + * should succeed. FAILS TODAY against the "if (toExtract > 1)" guard in + * ReactorInputFluidManager#extractFluids — acts as a regression marker for the fix. + */ + @GameTest(template = STRUCTURE) + public static void extractFluids_needOfOne_shouldSucceed_expectedContract(GameTestHelper helper) { + BlockPos rel = new BlockPos(1, 1, 1); + place(helper, rel, Direction.NORTH); + fill(helper, rel, new FluidStack(Fluids.WATER, 5)); + + boolean result = manager(helper, rel).extractFluids(helper.getLevel(), 1); + + helper.assertTrue(result, "a request for exactly 1 unit with stock available should succeed"); + helper.assertTrue(tankAmount(helper, rel) == 4, "expected exactly 1 unit to be drained"); + helper.succeed(); + } + + /** + * Characterizes the CURRENT (buggy) over-extraction: fluidNeeded is never + * decremented between handlers, so both handlers get drained in full. + * This test PASSES today. + */ + @GameTest(template = STRUCTURE) + public static void extractFluids_twoHandlers_currentBuggyBehavior_characterization(GameTestHelper helper) { + BlockPos rel1 = new BlockPos(1, 1, 1); + BlockPos rel2 = new BlockPos(3, 1, 1); + place(helper, rel1, Direction.NORTH); + place(helper, rel2, Direction.NORTH); + fill(helper, rel1, new FluidStack(Fluids.WATER, 10)); + fill(helper, rel2, new FluidStack(Fluids.WATER, 10)); + + manager(helper, rel1, rel2).extractFluids(helper.getLevel(), 10); + + helper.assertTrue(tankAmount(helper, rel1) == 0, "handler1 fully drained"); + helper.assertTrue(tankAmount(helper, rel2) == 0, + "handler2 is ALSO fully drained: over-extraction bug removes 20 units for a request of 10"); + helper.succeed(); + } + + /** + * Asserts the intended contract: extracting 10 units from a 20-unit pool spread + * across two handlers should leave 10 total remaining. FAILS TODAY because + * fluidNeeded is never decremented between handlers — this is the flagship + * regression marker for the main bug. + */ + @GameTest(template = STRUCTURE) + public static void extractFluids_twoHandlers_shouldNotOverExtract_expectedContract(GameTestHelper helper) { + BlockPos rel1 = new BlockPos(1, 1, 1); + BlockPos rel2 = new BlockPos(3, 1, 1); + place(helper, rel1, Direction.NORTH); + place(helper, rel2, Direction.NORTH); + fill(helper, rel1, new FluidStack(Fluids.WATER, 10)); + fill(helper, rel2, new FluidStack(Fluids.WATER, 10)); + + manager(helper, rel1, rel2).extractFluids(helper.getLevel(), 10); + + int totalRemaining = tankAmount(helper, rel1) + tankAmount(helper, rel2); + helper.assertTrue(totalRemaining == 10, + "extracting 10 out of a 20-unit pool should leave 10 total remaining, found " + totalRemaining); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void extractFluids_needZero_leavesTanksUntouched(GameTestHelper helper) { + BlockPos rel1 = new BlockPos(1, 1, 1); + BlockPos rel2 = new BlockPos(3, 1, 1); + place(helper, rel1, Direction.NORTH); + place(helper, rel2, Direction.NORTH); + fill(helper, rel1, new FluidStack(Fluids.WATER, 10)); + fill(helper, rel2, new FluidStack(Fluids.WATER, 10)); + + boolean result = manager(helper, rel1, rel2).extractFluids(helper.getLevel(), 0); + + helper.assertTrue(!result, "a non-positive fluidNeeded should never extract anything"); + helper.assertTrue(tankAmount(helper, rel1) == 10 && tankAmount(helper, rel2) == 10, + "no tank should be touched when fluidNeeded <= 0"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void extractFluids_emptyStackHandler_skippedGracefully(GameTestHelper helper) { + BlockPos rel1 = new BlockPos(1, 1, 1); + BlockPos rel2 = new BlockPos(3, 1, 1); + place(helper, rel1, Direction.NORTH); // left empty + place(helper, rel2, Direction.NORTH); + fill(helper, rel2, new FluidStack(Fluids.WATER, 20)); + + boolean result = manager(helper, rel1, rel2).extractFluids(helper.getLevel(), 15); + + helper.assertTrue(result, "the second, non-empty handler should still be usable"); + helper.assertTrue(tankAmount(helper, rel1) == 0, "empty handler should stay untouched"); + helper.assertTrue(tankAmount(helper, rel2) == 5, "expected 15 drained out of 20, 5 remaining"); + helper.succeed(); + } + + /** + * Documents a related contract mismatch found while designing this suite (not the + * main bug): the Javadoc promises "true if the full amount was extracted", + * but the implementation returns true after any partial extraction. This test + * asserts the CURRENT behavior and passes today; it is not a fix marker. + */ + @GameTest(template = STRUCTURE) + public static void extractFluids_returnsTrueEvenWhenNotFullyExtracted_javadocMismatch(GameTestHelper helper) { + BlockPos rel = new BlockPos(1, 1, 1); + place(helper, rel, Direction.NORTH); + fill(helper, rel, new FluidStack(Fluids.WATER, 30)); + + boolean result = manager(helper, rel).extractFluids(helper.getLevel(), 100); + + helper.assertTrue(result, "current implementation returns true even for a partial extraction (Javadoc mismatch)"); + helper.assertTrue(tankAmount(helper, rel) == 0, "all available fluid should have been drained"); + helper.succeed(); + } +} diff --git a/src/main/resources/data/createnuclear/structure/empty_platform.nbt b/src/main/resources/data/createnuclear/structure/empty_platform.nbt new file mode 100644 index 0000000000000000000000000000000000000000..1181be11bb64b26864f427848012e182ef456394 GIT binary patch literal 208 zcmb2|=3oGW|Gk$Txegf!uwJ Date: Thu, 6 Aug 2026 16:45:14 +0200 Subject: [PATCH 09/33] chore: untrack the world generated by runGameTestServer The previous commit swept in run/world/ (25 region and data files) because the gametest server writes its scratch world there. Untracked and added to .gitignore. run/server.properties stays tracked - it already was - but its gametest-time rewrite is reverted. Co-Authored-By: Claude Opus 5 (1M context) --- .gitignore | 2 ++ run/server.properties | 2 +- .../DIM-1/data/neoforge_data_attachments.dat | Bin 48 -> 0 bytes run/world/DIM-1/data/raids.dat | Bin 89 -> 0 bytes .../DIM1/data/neoforge_data_attachments.dat | Bin 48 -> 0 bytes run/world/DIM1/data/raids_end.dat | Bin 89 -> 0 bytes run/world/data/chunks.dat | Bin 59 -> 0 bytes run/world/data/neoforge_data_attachments.dat | Bin 48 -> 0 bytes run/world/data/raids.dat | Bin 89 -> 0 bytes run/world/entities/r.-1.-1.mca | 0 run/world/entities/r.-1.0.mca | 0 run/world/entities/r.-21540.17736.mca | 0 run/world/entities/r.0.-1.mca | 0 run/world/entities/r.0.0.mca | 0 run/world/level.dat | Bin 1866 -> 0 bytes run/world/poi/r.-21540.17736.mca | Bin 16384 -> 0 bytes run/world/region/r.-1.-1.mca | Bin 811008 -> 0 bytes run/world/region/r.-1.0.mca | Bin 868352 -> 0 bytes run/world/region/r.-21539.17735.mca | Bin 94208 -> 0 bytes run/world/region/r.-21539.17736.mca | Bin 778240 -> 0 bytes run/world/region/r.-21540.17735.mca | Bin 315392 -> 0 bytes run/world/region/r.-21540.17736.mca | Bin 2772992 -> 0 bytes run/world/region/r.0.-1.mca | Bin 868352 -> 0 bytes run/world/region/r.0.0.mca | Bin 929792 -> 0 bytes run/world/serverconfig/readme.txt | 3 --- run/world/session.lock | 1 - 26 files changed, 3 insertions(+), 5 deletions(-) delete mode 100644 run/world/DIM-1/data/neoforge_data_attachments.dat delete mode 100644 run/world/DIM-1/data/raids.dat delete mode 100644 run/world/DIM1/data/neoforge_data_attachments.dat delete mode 100644 run/world/DIM1/data/raids_end.dat delete mode 100644 run/world/data/chunks.dat delete mode 100644 run/world/data/neoforge_data_attachments.dat delete mode 100644 run/world/data/raids.dat delete mode 100644 run/world/entities/r.-1.-1.mca delete mode 100644 run/world/entities/r.-1.0.mca delete mode 100644 run/world/entities/r.-21540.17736.mca delete mode 100644 run/world/entities/r.0.-1.mca delete mode 100644 run/world/entities/r.0.0.mca delete mode 100644 run/world/level.dat delete mode 100644 run/world/poi/r.-21540.17736.mca delete mode 100644 run/world/region/r.-1.-1.mca delete mode 100644 run/world/region/r.-1.0.mca delete mode 100644 run/world/region/r.-21539.17735.mca delete mode 100644 run/world/region/r.-21539.17736.mca delete mode 100644 run/world/region/r.-21540.17735.mca delete mode 100644 run/world/region/r.-21540.17736.mca delete mode 100644 run/world/region/r.0.-1.mca delete mode 100644 run/world/region/r.0.0.mca delete mode 100644 run/world/serverconfig/readme.txt delete mode 100644 run/world/session.lock diff --git a/.gitignore b/.gitignore index bac3312..f407000 100644 --- a/.gitignore +++ b/.gitignore @@ -47,3 +47,5 @@ run/schematics run/server run/downloads/log.json run/command_history.txt +run/world/ +run/world*/ diff --git a/run/server.properties b/run/server.properties index ba9b844..5a07c65 100644 --- a/run/server.properties +++ b/run/server.properties @@ -1,5 +1,5 @@ #Minecraft server properties -#Thu Aug 06 16:42:00 CEST 2026 +#Wed Oct 15 10:23:51 CEST 2025 accepts-transfers=false allow-flight=false allow-nether=true diff --git a/run/world/DIM-1/data/neoforge_data_attachments.dat b/run/world/DIM-1/data/neoforge_data_attachments.dat deleted file mode 100644 index 3a9206e92793f82611804fe8834a4579db22c524..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48 zcmb2|=3oGW|BsUr9wa4rdg^$lB&0nkW4x5O()H-fpOrj3e~$7nOgZs)vm8(%0HP8S AfdBvi diff --git a/run/world/DIM-1/data/raids.dat b/run/world/DIM-1/data/raids.dat deleted file mode 100644 index 916260691058e46b27b9c6ab29699b003c188eb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89 zcmb2|=3oGW|BsUr9wa4rdg^#SNlD=KI^(06#=w}yR=593m(cM|N6ySSvSdz(zxVQkTk1sVj%Ckfiueu93T{>a_cu6zz^fCiQv&J1UM z^P5qfu{tY{Be}_T`kISSOTgV|8r3C1XRaShdqW z?zB5>DYzXN;xVatAc>n*;jK>lq<#Fwh+^J8$*P#y^4;CDA`en)LW&G9u=E5;stbfmx%}BW z+t1BuMCslcsI$%Vo;Gz>vrA*Or50df6lz4h@TQqWM(if5O1=O-T&_sfpp%4*mA3%1yR!V>1t&$3yox6N)4iYsLGJ z(P}c)QdqWE$cM|ugz)Nh$#3yw7_Y<*RRs^nlE=&a$3ls49~2TgrJ*AHH^mUw@(>rp znF((BKo6~+n*cRhogw}de=M1~QFvN}LJEgUhnALJ?iTK?96ahL{BN!9lM=t={B|zs zr5<>mnE6=U|99ax^uWDwImUm$<%z*n|| z24lNeEvyRG9@Z9C18WCs18d(`EMrYy&@TDTqJs`&+gR&Kfo&x&{25?D-IZAL%Ftb? z=Tf=2GhWu8tzd zlBF^`e2l_-gwkg0um1)Wb>}wL(MxUZ`5nm95zD3{-s`z^Mb?@~4c;1P5M3%zK`{ab zPhu6He>aoby}4)ftVaQ~u8+C2IR1p3-7EB2Y2Shq?erViM5a969ltc$0odqHB;^Zz&Vcs7qS<$JEbgm(nj#Z^Lx+0kdSvPRGc`foX7Y!rv4JF- zK^lk%@JcWnD|e2LYV225>HD)Fn1d|ff>wV_7}WXjYtO2WBrAKQ(3ep}B1DZ{lXbo> z4eu-0D!9C+lq+1|(tDf!ZGEkm;i}`7Oqy-Bg#aWEb!L~r+jVVRM=tw=nd@~Wyy3Tx zM6^d^4*E+1y7mH64e#JJ=E1pTYaQ%tjSbQFv}$+X0)Z)*E?{BAfrs?0DKuKXKm*S5 zvh*L2T-DPwB<2B$9*yRcOEuOxTJI4r^AW1jdxtZlKTr^dsG}}dFM*8PWWdNI4!~}x ztANhLof{0IVtMVLxq8_pY_4w82$YTyfV2dzd5G?p`L}~tx{AYCw7|q$s4_kJ zWiadt$2!u1C%KmHw?Jt3zJgzqwXUURCk>%*@XD3^qPj1Y)sYJM5(u||?xk`hqD@W| zEus5i6viaFt}_&iqya}?fj!5C4E-jpRZw1t5!2(*ht(@#>nF$0Pha>97YMI#zbW

e_97BeDsB%ANtqW~#yU1yrau#||)rv zv~JpUj9%(|fwM*o3&N3mva`Fahjbngx@1PgSZtlu!-ws-uX z-w($WcvMzx><|wU>eC%b-%aZ`n4UlL-&I!6yLHy15pegzCi~TcK8$APcCNq;n0RZw zq>M!B%Eoyz|JVGWP)&#Z-3RkLB9YGgwMdJhfIhaL{ABw|EEJEzAlYQ>f381zGtv$K E0FTkT5dZ)H diff --git a/run/world/poi/r.-21540.17736.mca b/run/world/poi/r.-21540.17736.mca deleted file mode 100644 index 9029059ff54f4225f1d0b001adca04c34e704036..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI#+be?s7zXfd*2uILePIY`yNzAM%%`!1_LIO(<@bI<&rVXNk%`oOtB?j${pX~HKx0k^l*Q%8=gZ5vI?jh?YM zLr(Rx%V&1A8y=Hxq+fL99{()LSTP3z5P$##AOHafKmY;|fB*y_5K#jE{Qm@BZm%VG zx|SA$w{4{bTU7 z;`eQILKv`e9}@R%{xyYuWORNyG*wlx)h0^NCKsr_%?|NxXPT)+tZO*RRCM!=5ru*> Z5P$##AOHafKmY;|fB*y_0D)){_yeHke((SQ diff --git a/run/world/region/r.-1.-1.mca b/run/world/region/r.-1.-1.mca deleted file mode 100644 index 500e141f41565ff6cf073d2fe0559569e99272bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 811008 zcmeF)dpMNq{y%Uc$!SO-G;)X>8;oNU5;={uL^)?DXXThfiiAl*M8=^cOp7QYk`l%# zr!a*`Bq@n#RHFDjT6?YiTWjw>wzluuYhU{_*Y*CRuAXP~x*vbs&*#2BHys^(KmY_l z00ck)1V8`;eoO#GPe&(&L<9*dk_aTCNNyo9K~jvQ0?BnGp-7C7Ih;bsEVDB)gED zM^cEy7fB?Nvq;pCSRt`TavMn?l9l?%A@^cKqKqU7Nd^)$l5!+lkq9EGLUIAgO(eER zE+Sc}&t>FZ$B-OBatO&jB+f{zk)$BeM6wwP4v9LFWF!ZXtkg#jxfcn^Pe?W*xr;;| zNg@&lB(+GKkSHQKheR7mDUy}?6e0H_Ajw4Hi9`a)DI`)zC`c@jV32qq;YX5%gagS+ zecX_Hl_1eaqJks<2|JQ_BuA0>Au&hdh{OenDUui@EA`<*?!}2j97#HoYe;;M2q2L~ zqJ-o=k{d|ska!^pL$XqzVB}u0NTQJJL9!jmVI-T7Bp?Y#qJhL12@{gFNLY}p)JGS& z*Uw0{A-RL321z!OI3!v~@{t4~S&w855(Xrzk*w6G8oAd_B&kTwAQ48g8wnOkJ(B%M zc#(J`VMfA;WEB$lfB*=900@8p2!H?x{D^>?-=*z8k{|i5e|F7}eD~5d|Lk5r@^|q4 zF#bRC4E)Hm_Rp^Qk?)4*|9|%PUmY3y@A+rX(vSSzGM~S{(D$#>T@{!yk@hIQOKW}D z!CWotlkWKLbouFRQ=c&dnC?6wybf)k{N(1f7FD^hZ=UD#Z`VZ5sqV=RYT}kH9b)lm z4S(WPbDRD0qok@PalCJ@ebA7kY)XQi;f>aK;Y^>07n(diU&+B<=(A~xvf5VR;F$Gg z#75>w!0Q8xbJj;cRlRmNmdh)%&-`b`OGhe&E`QmH!LlB-n)=p8BRf)OKg-8EY3zUT zv~lPj?+m5#y3=pP<3xlsJJcOQ*gucV=qF0P@r6Ia{0-V3W7 zM?RA+`NE}Hm4A)i%V8Ispz&(Gef6D>y|Dg*#teGYy3SHBY`iztq_uOy+tGUc^A>Vu z%6nw5ei_|%Qtt7Zye@{+-8Pa5tv0?NMl?fL_ol8g+mq^)Vk4CxPRCBmNOrxq{=)Hc zwg+@J;tTFS@=F8PfB*=900@8p2!H?xfB*=900{hv0;}}C&;N~&_GxiyHP(lDR_!x4 zJZhf15dJ(^YDk6g=ziqvlv&f5tLyq5$+&lA9uy^oyo>k%gayc`iH^1?&%Pv`~51c3P$n>xt z@t6uB&(w$1VTno?*Ie%M;Tnq^Y5w|#CZB?fZas!#F;vWJi}d)}FHu@~eOi2b{kxL^ z$37l?@X_hLgq-++;D*tBw%jXEjvS-x(`24=dLh7i@?NNUfCvAghEr#2gTlS9f*Aqf zM`mkKR?e3u8;b-YPF4mzMeh|1h<2PX5R?qA)VcX#%bR(L7eiM=`#f$-9_w%9u<=?S zU#ic2VK05$j;%MjOCFNb(x17cGq&OZ5jKx?t>$b^g_{Cy%SYOA-A^D zXM}L~R;rWss`WJ+@hK;}TMl26@a`>O4&Qv{blvINy*Y|El%E*xUvIH@@G(1$6s?o$ z+ub7&_@V0MBaz0wTW@ikDm>@>{sQl?zB)%b5>0gjB9A< z9P!4k7BuG4dpYD{BN$8k<$XXJOC0%ZcHRq@x2kDOaih$7v}c00S(A3>7^7clyG}e7 zNxQK){95~Viqyab*Sh3&59^d9;umQL!U`Ym9E)&0_Aqyy>#Dtqk1Y8cS>=QMTBcZ8 z4HjJg#Ag=13Isp^1V8`;KmY_l00ck)1VCW<0)MOjw=LEGtC#BkRZ8OHZKPS=K$_UC zf_2hciYgoSDJGq|wAV^OQD=HYs7h{6`P0J#fpm`OHP7EyN3=J_S5aDy%c8>=aub|_ zbFWl!u8kK`&;p$MAH-;T`R z+J04alDn}XTh(;tQ?%WL5oX4O(pf)MFfeBN?pXY$J40L1t_kAeS*tPv_qP3h_P>j& z?qj!!q_Q;o|7ln|=;3d(|3}E|zwc9^qecQU`>)JfGcl;MH2XignY!is?Ej}NW93Tg zugUEHdXh?;Ag3NOj4XfE^v%z6ds_tK*3*hC@-FAH9{iaeJc~!u?Ds#v6xPyxp{_pZCYC1i< zuwmK7URV<^WY!-Wn=Lu)VyK#?5Z6%Cc}JBWrMIu9)65&IBxt-zk6PV{^~TByw(S#a zQ>2Zt_|Mym>C5m+RqTs#xx85aC~|JIdGKcH8R;#FsqS)@zrHS~+rBTXS(5rL(P&E- z;}ybWi9+lFhYv#%l%tBD7u=Tr;K3Cj00JNY0w4eaAOHd&00JNY0)MK&-|GL%nExNS zB)6>jzxl<(Dsqn-z4_bzR{nS7DNtd(;rYG%?^BBh>ArsdS6Q@_aaQsC_XVK)dGZ_wLE>3r;sWfwH&)}tc3 z1?oF-ikUa|mZNru*ZE}K@^<5DQwg2+&C<|MMmJ%H4Wkc@ro~7sevz$iUw_4?8CyAG z8jYoQA(&?_^Vp?1oHGX5x z_ieg^))CvzZe|Ww)yHjR(^Y@zwy*Gz?y1!ujR!FCsrpH3&L{4ll6b#;LB^**_Ilh2 zO{JyjKj-W_3;$;ej!%lSMpaPbf{MlZbwSnrMHh-;|t3{*{9 z7e_vqoj2r?ubRdmM~=&O9de2D!aiz4Isi<5?*Ne0jdTDQn?pJPm>tjS+VQ;u03PW8 zFuT+NAWbl759x0m0F-DMx!(6Uv-Orb0Em|?crE|YgDXG)1V8`;KmY_l00ck)1V8`; z{zQSl&Hs&-_Wy@1?f-vXD3x2DZyLJu=#J!dU03h&?M%#z{o4E= z>CBY`N$;y!-oK>y^0oB_(s3m1P8-V&pR*CeC3@r!nxuH!(9OTzY(D;RuKRljz?Sn8 zRxULg4v|)05Ba47poTS`Gr-#tz4}<^Ug&AQ2^ssS z8ToDVOyvY^^33oZBS8U^Vg1hjEy1^s)^uoc=s8m^9J^*z+^=zLC_FnbM>mZW!QwTt zQ^}-NJl*YxPqybe3`3FqU@1q2%JI=nOZETrNd3PEssES!R{vN2wf=wd?N5KN|JNMu z{$BqNz8yZCRDV{}Be>!z_5wa{>V{wt>4qmc^*r5SuiYuqn&Yo-A@zTc?xpPoJBN3= z%5NiNd144 zQn_lHQXG>PmM3m>V;mXT3E+*@6*OL}x38g7Rh6Gt@8t^@Db+NoIC4~W-b)vL)im)q zGV-nzf$aZBf8YPVCBTi#cJv?W|9VUH|8AuI--_M-`tSAsToP^$ssEc07QFw& zXBNH+1V8`;KmY_l00ck)1V8`;Kw$X-%isSmy~6wd1ONK_|LJ7D_y2!#DrnbI^&jc~ zpYmJve;%p+7kb94jB+nk|I>pz7L31F|CtnQeU_^K>&+8STJQ31cBp@^vSaW_ngQ7? z&^qp!NlzISuOFtMn*F8kQE){8O)M_`m#qbXd--GhYMzu?Jv_ULHLd?HVWVQgR^PU{ zVD|XS0beagEVl38M67aOn*48`dRp@K&X>k~N0YW~f^AIy_Uiw{?YGa2emVHn=4X^? z?iz*IJEkJ36{EusLr=06DX#uGL!nKs!c4@Nj(=1`ni{x89CcFRD^nn9!Dsmo9$Wze zAOHd&00JNY0w4eaAOHd&@TUs=IraaB6|DcKLH+-)R{!5K4E6s%^|uzj3lVo&hD7WzKvCey^@F_N)jsc5?4=(J#eCk(z$oI+USfg4~_H{n9}{+3)nVR*`WO zUw8P1<-waTI%#p5F@o;MlK+kX3m%4^8F_KHx=MIaic+`xwi+*@IlkEY002izPSpKgb zTmb?g00JNY0w4eaAOHd&00Mui0KMa?z>NCtmOT^<=jsk?{yyB?D&;eS_KiF|o9Xid z4GN@G{H?D?b3f%~3{hTJsa>=o`Jxb?6R$JQ`Cg?w=T%>maH*IJHm<4s^4AoN$cA|e zJ`M(aw>%l&zpU-{|HehYw4L=+N=RET>H4BY>7Ek%INkK^q8W>JMgy!rzv#jx*MY`M z8AhW1Z*Mfd!7_7R3C&G$$k%U2n^jdzTzjBQ)f^Zw%HuI=)^+6)E>+lK?xM0@HLlbB zqA#~WAM=3ep+x<;2Zfw9g@u@4ww6!$bn9(7>~vja_jL}3dg38NH;2^@i>UFgxK z*JYa1^4eWRIbBaiU4}%2VvS#DUo{Wr`VvMA%~wuj-8pQ)KVB=2@e3*mkZX;xez&_f zIsWQH-1WyEuh-7f-wdK1`cp>~z6=CF00ck)1V8`;KmY_l00ck)1pZNA8T0?I%B;$f z_R>;kJ6S zgp3_OhxqoJgnE)g?^LFk%3e&0=@QX)Ic%8Uab&BPV0MqpYw^TVuDiKSVhJ;$*23Y| zFUX(DQ5%}8k7CSqtNMlJPM#}^JuIG7Hd*lT9uq6Ao)SXCD4`h8?>U>rV^xN!=z3++@#5uCyhajglDJVS>aBXS4^x!2n|t93Q_ z(`zGjuFr^kphqp5d5ZCd*ImGNM;hC|`QY^4hQwRm8(SnTqFW3LSs^HMIX-~4vn9i7 zzGH2^%pRZI!)|pM?J}uSxy?<{TL?{MT=(Kxt$RK?N7P`YyPoK{ndam~ZtI!q#uhNt z_0)Dbs&R{TK6X7f8$k9K3hc6{%b(Xz~iKK!Crz_wf~ z8A;w;-H49nB(to6y+f+IZ(6n+i@A#W86_Bqj4hUFGnUsHPaGAJN;)-YpMN%_Tyy3d zpQk_zeyitz<#-S~&u9$s%P7GO&4k0p5TCvz^x^Q;ly@}DCN#N)5`n|lQR;B`TFOiy zNdu)gM2Nz*o*}9Y5jcWKqM7{*b&bphltjY=>Di}ZLa@q_tkL_&bVnG_3weF|a*WXu zt_7^=)g7ySD9Vr$d9MCu`PAf1ixg;^PMly(Y^iLg7_%aXx0T2KI5C8!X009sH z0T2KI5cnqo^mgCp{}1;t$g?ror*KTj41}@1uZfiw)LLa$Y>;t&yMO=BC6b>u4|V=T z(8uOm*;S7yN56cON)=*==s3=qltxHQ4>yfrRm)6OkeJk-Qj@K4O}ojwyQBc$bJOe$ z*Dkh`72)w^_S{+_r)5l@2u5D9b(XJ_Dch4$=4E9gPRvy=Nsz?-+j$+m(o8c|*km;_;v-Q2O(G!lla*(iFWW;2r#&b~LV6IU7{74L&$k!>1>aAHE zR4QRk9se^$M;%{45mRr~B5r((5#8ieK*9TwL^q9E5Y?tDCQL%kZFaSk9}BKj@<}iu zm-z`N7#E)lsXiTQWvegu(^RTVWzky9u^?ZsQ=i({kHy^k^b^+d(CyUsJLpf+7j2rH z`zPe^S0DfaAOHd&00JNY0w4eaAOHd&@TUvV6aMA;e~9upvi;w%1;thpqj*{I`2Zht zXNAPh-ib-bjXJzn^frM+>Mot)nkFu!Xs zzO$^jHKMEg((TJV_5_U}(l#`Clu%764J09Z{M#suxK<4m^#$QB4&Ox4!QopeVmN#} zag2sxKsz;2&IOVf(4*&xY9GG80yvMA$@9Cd#($?t&vD*%Vzuh-6dAqFi$1du~*qH3Xi0e`h!+g(Z?U95&rZsg)amF5C8!X009sH0T2KI z5C8!X0D(UWEMxxvRk?qe^M5-%K75IYt#OXHuA$Ye5BpI~_W#W8|A&;2>Hoy;fA+PL zG><=$!=FI_1V8`;KmY_l00ck)1V8`;K;TaoSjPN+`SpL8|1ZkZ-2e13g)amF5C8!X z009sH0T2KI5C8!X0D(UWET{jUN@dqSwEs^)+W$NM(*B?K|8M`V@xA@O^zYmM&$=wN z|F?PbOb^lCAHAT~0;9>ISX^~ie z0yp2?drvFZkG9DklX%yx*Lmo&xm($1#;v1n&B!20uxE?jaQXuOnRBm#NJJ>s_=WaW^I)zoVZ_jU9#r@~5C8!X009sH0T2KI5C8!X009vAgTN{+ zr2pSU>Z7B5nDvc9q8(yipJVg-UDHY*Tq(b_TXLdf>&_0LK1qd|z1M}KzqWRND%HFv z?c3mDc-tuF?Z>^L+ju^eXns1tbu!4C-eYV0hJ8j6pIN!4wQi-($%tezvevVI-X;HF zuWr$iDES-vuWw)T_5y}O?gUzLQyrJ-SlGCKb>ZqGnOW+_WW2Y9`=iyo$u>-Gl4@^- zL^WO}>Ychgsl9Q-1;cHJb{6v57Dew32^Qf=e>(Q|z~cTM-v=N3j94$)Z;-OP){mYg zo_HiMR&BC+_T#Hv)H3}1qO!lD=k=+{-tA*S451I+`&WHr(p#ve%@2IC4DbkPed+iT zspj9uO+IPA|I=c%P-YxQ|D_w#a`6El*DRh`s0fFY}PS+lo~>6LeV^l*{NS@o?!Gs(O5u$4zqR>V(VY5azYJR%P=XOz>iDQumK>2c3c zJ+}zrVmV60=rg>6B@<82lcn2aFl$rK?ESoo3W%#{O62Md%Ixd*vZdsNrY7TfAO6Ty2{MD&`|@U$K$WeibHptYOPp)m1K6j^$HEQ1^=+ zqk&d=_WS?vK*1kD00ck)1V8`;KmY_l00ck)1pbl&%h~_0(z49{ zfB$~}e{yAIimB|yq?j%dZI{D_`5i~LdI@It$h;O$EakeJ+a#7S6KX9SZvBG%sT{ST zx%w!^T(_!UXzt{>ve?7oNoA7-AMY`-(*9%p|2T7Ko`1=4haU^HMIX-~4vn9i7zGH2^%pRZI!)|pM?J}uSxy?<{ zTL?{MT=(Kxt$RM|Mbu!WyPoK{ndam~ZtI!q#uhNt_0)Dbs&R{TK6X7f8$k9K3hc6{%b(Xz~iKK!Czz_wf~8A;w;-H49nB(to6y+f+IZ(6n+ zi@A#W86_Bqj4hUFGnUsHPaGAJN;)-YpMN%_Tyy3dpQk_zeyitz<#-S~&u9!0X#wDd zX2RiPh)-V<`f&Ja$~zin6PnyYiNN9OD0Mh|EoCNW)`!&nqz7juZ%Bx93)EzYRM zSZU-*U@H<6>0^!AD>#~l_HN+XV?ZnSKe zcHVyQ!0YRw2MZVWxoKX#bb0!j%+K_NCj*YY-unFg$9c-^jF!(}kk`i-#@nY_rWYNb zcZ7Io&6jGvn`mg1pnSVDY4@~h&25x6Gc$LYr4%o}y>xiP+s5<#ty=@ADMHnBfm4s) z;(YI)aPUl#GS4^5bI#*b=5dN@B?+w7q+4t{Q*qz1L{IgY!zTMpZX2?S{bkT<{C7M~ z$*DY}HgPf=(3;C3H@BRmAhO(Rvu50$8y7T>4ysqB(l$E)bL zFH!CNxYAcgugT2j<6^DbHnkqz)Edjd-1VbOcsZD zSIuL84ErYhzBSaY8jrX3ed?q*j?r9>QS$`{zxSQkh&h%PWwnDQx0yB;lkPJ{d#JM? z_8I3I3`gg%JPu$_-}a`-NwQkp;M&~=+olGMjfp#2xWr3xHw~(-`bvLX;m()8=7R}8 z6$pR;2!H?xfB*=900@8p2!Ozf3M`}k|5c^(;(uxX|EE)!!T(JEfALV-(G?vqxETn5 z00@8p2!H?xfB*=900@8p2>gJ+a{B+Pu;whc|Nq8+zyJTU|L*?(-%4rjKQJzE2?&4y z2!H?xfB*=900@8p2!H?xtfT;4>QmH}=5go@llhO!@>EWg^tZJF53KEmrQ);pm zu4y-!cb634dv2PY;o8M^vLZabY-oGfER*Hsd^MJxmF*5^EIlq6dPWa4?vQOVO}INQ zKV#8x)_r~T)Ln}gt;}sg##Q$xDj$>&s7y|7NPT7KQ@|&}oN6k6_(j^Pj0TJg(RWj% zYWT^>jnU^dCn7kXWsR#p+kuK*t+{i))%L`j@z0C9lCvaxC;aWIc1AvZgV9vSXH&vB zsGS53Khg~j?l%~sI^KjhHjb>X=N`ipb6j|XVc6vKGv%BgshC5tlMv@ea@;gp_xMs&dVKg2 z5nJONaa}{JSs(VJn(Xw$?u4=8jJ1g_Z?U_-Zl~Uj->#Oj`|V@f_)b^O&033w+v?2{ zGIsnN;@fW$>PZg0^WWY7U(<}{{i8zz*MR^CfB*=900@8p2!H?xfB*=9z={bhXaB$I zIw?l$pIpD3A{_H>@NK9RU=UXSEcWv))rZL!^SFG~OAh5HNr_5aj1cbMJ*6S%VcR3b z#Y8R8Kfs-5kdVkzWka#17IAPMWHpL^g+H&e@0$GZU~2b?XAdi|rq?Ee&+R!)M?ZHU zSdx5pHR0?+!eo32ks}i73bI_@o;HN?=y`&w(HbOzWYvUDhWBU9kROO(K(C# zEL_i6RBk^w@$+7$lc)2fJ`5~$e0D7Llu^to^>;3Otz<#kh8|5P<^}OhVPw%x@kCb| zh8|V&h~gJWl0$KSz;L0sX_&Pr>Px~Lt~HFf@dHK_JsL(-8zIDn9GT}95*1@NlCt%T zW0L#O*}Gm&%qo{R0TnoV%}um|Q|xk1v7E=MT`4NZU)SEdQ-37F_RH3^))K?EW0%8( z1Rv3ktk__|jX(edKmY_l00ck)1V8`;KmY_l;0FbkG5-%yi&zhLg)Z~qU$vX9eE z7Z%Ofv@;rD{n4Tems|%LPiGj3`oF!=_y)_&c_lPE#UWq6{jwRd1K`>N73za$1MYb| zM$NjeT*9RaTg+Wl)~m*Lx?l9=Ht1s>Fg=v0Klh-Jv*y0nzWGWb%i$pvQohLGd(;Wd z-IWar+=kWx-NCk}BmZ;#{|ryje133f;4%;Z0T2KI5C8!X009sH0T2KI5LhvRWvu`I zs+zvc_5TZJFeE44yJ`ByXOl{&UhzLqi}DYfwXz77aSj(tQ;+3ZY%iUBxu-ohLEXQ{ z(T|^zx#K~Xk-WK>GfHak*(d73(7=Gtrup@WK0jIMFc;ztHuSNtj&qzzd-Y5wQCYiu zeX3aE!cl1*FX?BG7d~ZaZ=7W(=Qjn+?;4EnEGuq}=<2?7`*M#xK_duR06-okR8vX= zNjuQwHVPxIRRcwRLAZ;=y{^rhl&Z4kaOp; zGI@Ttkt6?_^c?ryIq#Ber=v0SA~QdBMEiVTV#D2{wQRP}-(6y*4f9lT9eb7SqVPyc zsXu5{75&#T=>E52&nnyq1V8`;KmY_l00ck)1V8`;K;Xv(mQ(*%_F%2qZ)SDUo@ARb zoiRPxpmnBw$J%_EJwCaI-Rd&hWm2Vbo13Dy5Sq%k?!~iO_k7fgsKH8iJ<)M9&B=+} z)-%&wvcRhHcv$D_}(w0Wtj_o z_(i{fZMjx5lDxUP5gpA*W?2J!hg5gpv}`vPa~1V7N-z)^TP)LNEUz`5I4UHSbZXE( z|7=LP=FB%fPk|QvR?h*;@gR1d(HP>FQGy$q35Sm%K7C2(!{Mtb?`W7!XmSfB0*9}o z)Zy^8l$k)121;>=5QS?!LsT0ga0HP=Gy50n8kr3!iG~N#vrol@V3i|TqxX;LjxeAX z^7{1U7^5Xz3s}>uJ6^RtufS|OQY=6?pmA25R$y9kNn&VC+9sOAkB<&q2?8Jh0w4ea zAOHd&00JNY0w4eaDSuo57+E+zCt7QtwqeXoL`l-Lt2V_w(4D_~xeWmCu1EvGdP)clql98W zlj|w(rZJvq@gc&eAQA_P`ih{979S=!pv7Mhf^qmv;>Ib=F0@k}MQ{p3#I+_o@(dkz zjL0Dvu zWbmnJHTF!;mF&n>Vp?1&IvdmkB#LjP;7XVSz4En+ZnK=?QQSdx{)KYJSp99U}phd;n=TSUlS`&;ur>ET8GD5x4b>N1Fdl_g<6}OO)jKwfW!Pg3F~_c$H6OwWQzoJ$&$)gUZ?c-;4jsB?nEa zRg6Mm^Z$=Ons6lufB*=900@8p2!H?xfB*=9zzPa1r~a?(V98u|wd(@|<=ybP*XIIM zn6&*S4fY=PPL!72Cpzlq^w3PweD@xiwY$n2aF7 zR(V|ViGxAKR#}mV{p1{$iKtbL^1*FBM??$+vaHYI*BLC9ZxFe&;fP!4{N60KuT1;Q zM=HN%y>E2sw{X&S9dEaKSS(ScP`VB#upCY|-K)1QE3O zC}AC%+(?-TBGIE1M+m!dt@J40CW_#fXP+cAcI)$BG`rg;$Zj)|T`Xy%Uuw8bL}+Tt zJDrEKHS_YGJ~(3Zzv0t*=LO zKjmf&Q5H~!4FJpC08saY=JZ1&0~dh+2!H?xfB*=900@8p2!H?xfWXQLETjJaRoRFI z`u{Dn|KHqQH~?Vfo>sUM2!H?xfB*=900@8p2!H?xfWVImETjJaRfRPNIRG&Eq7a`G zuQSg1UZp(eRbP{EshA5kuBrU;*A$J&hItA;4hDR;JQ?4=tnK#y#znxio%K^nNLw%I z`l3bYo)Y^w-Sq9E8H;vC1FS#4=)xt}fyPT2Mxy?2Z#2HaGIL%D%}sI0*KbFgRaHz} zd!S6!92hXl<1uR1b>$K+RoG(gqOx8!uG9UZFSkJ-^ML80ME$u3g`72oUi;?zi7bbQ zR7m+EgA=F|n!EcO6u1qo1GM-F`AW0d;J%yRa;fcht4;Wz- z_cTTxbzusFoDKMh!WKvpMkx*xI08w#(4$SS%QUCuwY!RPx}J=>42cNE8o$uKY97q> zC5#xFubjxbbJ&1?yjC3J7gQ1;*BWE}Zg+2T{MCoJ>yJHNubrizzXLA-e)Qpl>p%bm zKmY_l00ck)1V8`;KmY_*On{#7udn}CX+fs{hAk+zk{HFyiq8l5m^&*Zb|%*w+$hDz zlBlU$_T`#wR4W!^d%DyBkT8DNPLB^?B4TTtBd%*`HS5EERFi$V?f>trNc;bXl#uEF zMEigC^%*qJ6&owK5eR?)2!H?xfB*=900@8p2!H?x{HVY(*8hj7vYIWo|DWi;-T#mH z-`)R@`!c)$_|az*t^)xO009sH0T2KI5C8!X009tKIe}%&|G%ngOEFsit)vgmC}vDGfOf+a95%BLMXeaOW8$B=Y=r z1R$$X{44xI z9GfH_E^X<3rjf^XoqEZ4-$_j+At$y&R#!YaXR)7!>lus6?FT1*-ph3Ibe`0QfrXCG zj-{S5idm)p&V{d)EJ)kXqv^!FAigP#EZQla=t{%Tqe>o8`~pdGDDDp!E)+Knvlc~t zNtna6h7mV@z=)zp!-#4le?J1yNXphT4mkp_vv<9mm{l(CuSWoKie1hrmh)J(D@En_ z>)LyF>W@U&e%YGVT4LCC>~fgUI$@aquiVoLcLD(r009sH0T2KI5C8!X009vAQGvg$ z|9`mD|DS2-0k+igEmfy!%eeCL!6$PNgjw2znDz;KK=Ln+w>oQfLqFjyEC4`%OYU$vu;kTgK`W zeQ%eY;j}WeOo3_DP59W6b#&_QE zz9eaDf$aW&t`+emiBNTjWEFLajhaaKbcj^O#@&ROSHSBXT1PyZ_^j$F#3LsTcV`k6JYI6yrVngnQ$!yZ>)| z-~Ipem)-v}?|QhW*thr7ynl3P;5rZh0T2KI5C8!X009sH0T2KI5LhvRWz_#e)U=m- z{GVd2ecFaGHxVUC)2`YS_ds|4?*B{!fO<*@?LW}~fMM$#?dXaP7TgE~KmY_l00ck) z1V8`;KmY_l00e$eU>WoOuPOq|-v2N1Z}0!V_TRn#pUI!*@q-@iUF>wCha?k&pW}&&Q*l59xKmY_l00ck)1V8`;KmY_l00cnb z#{`yf{@+(MQ{i5g+*fO&p4M-CwDJ8Bwum>+E?j9I7CT@?-rYLZnwV#re=fsfU6hAF z&HSArf7_dXZ2zAbMK^uBXvU(Q(E#huFS>Bab)fN5hLNcM+Z&Bpmv*B&TSHJ=R_$-9Ymnv*AcTrid8rSK5(U;qxk9olKP@?|agF?=lLa%-E z{X~|-Ln@?vk--Vn3C-R84GP?b*2w;UyVH?hMhI1bq%;py^#XXIYM_ri0>_C$rQP=`W!YIXI0!JWe7y9q}|8u&Yj4ti}k2QXwebqde>q{6h zG+#N9b?2}F|F8T1<-YI#@BL-}|6`BWYiF4ZSJ8ZaY+&Fj5C8!X009sH0T2KI5C8!X z009tKL4jq||3j1ol%WBD27h{Oq|Wu3-#P$>*ImGNM;hC|`QY^4hQwRm8(SnTqs4951*P2!H?xfB*=900@8p2!H?xfB*>mh`=)T|A(lwblFQw$!cO+ z<=O+=0|Oj4>%2~2H0N=y=u%K}*u#4fpKN+~q%IM2sGnJ*F|u$xn45rUJL{*EkhWgZ z^+k(P2$p@EZo05&#^(D10Q4^l08amI0YLWm1pt@Ls_r8T092?Co(;JFaRET=KP~{c zk1PPF{A~fi`=tc{mA@_kutgRCj1rV__%=!y(RCWL28T~4u3akclPMIxAkukabRdaD zGzcW2QPkH2CS2=z;>Kx=9}p{;=5`$Gl@Q-R_7d)tx_>65nxbhg z@GyDvv`DN!ft&B{y{DDyN84nNNxW;;>pXPX+^y_0<5xPVPtgDGN1jW#1_VF=1V8`; zKmY_l00ck)1VCVA1?cTo1!mNDKitD0&&Fh*!Z9H;5XSnxCRSQdYn55CLB{#*{{26f zNPgNp)R~15<2O&@#Z(v%&-#weG|~yrOfu#=kw(Z@9uI5paVED$S90DnF*=eqDjMD? zBTfCNxWS>0^Yp!&}}V(>2Po^}Vps6OOxbkg!{1 z#ALfLqsp7R9HE)ShVaZQCq|E+crzZbxGOnJvUkG&vhtPMkTJ}lIzF2c#zE~QeDWjR z;NX6PnODb~5XZ(bSsdJBm|~6#Z!ip-oPMU9^CJ~=D0UJ!{7Abt{cZ7oc+TPaobie7 zCS8rxzOG0e<$49=@V^CDe_=Jf8ogWZYQ?L2U$xb2?BiAGRr=6}%>5IdI91UYXXzsk zPkvh2(So~y00@8p2!H?xfB*=900@8p2!Ozk2`r=j|5a66iqZNf*Dt3C$GjVS8!81D zgw;Qb{d`OHVe-X1E?@PML-|Qkq7oM)g!^|-X~=ol_GEG~Q491BaOW8$B=S_*P^_s% z9GnMPjpAS7&+F{FCO z`$=xaIW|c=T-wt6Oe2r&I`xw8zLT0tLQZUltgd);&SF0c*E1HC+Ye6syqD?Z={%_q z0}CCW9ZNlB6thbGoeN(pS&+7&N7IRUL3~pfS+r9;(UpdwN0mIH_yv;WP~0CdTqtfD zW-W^Pk}!vB4I^&+fDuKHh7r|92yr1t=DCGL#n_FcY(3+cT!1#IWtyukLu&_PheK?MSfz z;ef_jaaw_C$t8)QHC&=F|6jSM748HAAOHd&00JNY0w4eaAOHd&@S_6%r~Us!b@=cl zBDTgk;<|=bvp(!cjVbC{A+j<%E-LO^XMCyQOsKQfXK#tuUHX^qj?1gFuVQ?2a4eT3 zl~}SS`RI}Pv74IIf&cFQ|N4>8|NloHO}GvOKmY_l00ck)1V8`;KmY_lUSpWBm+M`t`Q`FMVeu&^X6hky1q5IC^3_#c0O+qQ_1z4o`o|I)*a zZe)w>JSyMxBfO7LK=6%1Iiv%??rS^4=)PTd$RkI6d{;Bl|J&mK$414ul5QHm zNb5B=+7^n(A-*Pz>_#V(DAyLuDYlYr6u(2H8*JRom;^TN7ECl7^#Wl|p;aqtV>3o{ z4&?Ede? zf8~;cCemr~tj~zufTQdI?lSUub#SP@uHQv z?Y(hT#YE+UvH{I!1FQ-y$s-o>I-Cl*4$ZYnt5xF&9UQOKS-cs)u_&$+4((ejd}n8m z|D6+Pe%6!WpHlnhI(ptO5T$nQE9xJ|od{>4UcfkQ!3%EI{pgf-8g2) zCh|>6ggQQlQm2l;N@4ROWpOBW5gOE6b%<&m1P=dSm;NVS+;HKBinS>3mqTtwyz8E> zZ)sYCo4xiVazt>o(8F7->2!`MDr=lw4nDK*X>vzS{?px`{-vFJXiWmwO zDHVU~>(Sg#xfw%L)}?C~ZAiW-#OK88jB~zMDbIP;*Cbpj=7NoDD!=?SMI*9do`R2q z0pBf8#`iC4yZygy{QUud_mq|n0K8o^WAXg}K>lA20KD|O0|0Zs9{`9pL*4;gd!S53 z-T@f>@c_WMe>?!N5IF#_|F;7GCzcKX?Em!uKs)3Bz+pmF5GjpFkD?9}J_VALQQT9Q zc^sZd9Q%L~MsZJLM|rE6l?rK z`>J^`*OxG2XufhH>&{^V{_$FIj9*YmfLv>g^}F4@$?;bo;;ujTc)fO({#gOdWkp8} zZUzD%00JNY0w4eaAOHd&00JNY0?QZpzwQ6${O|Yw^ZM`Z|F?b<^#5D_Qwdjq00@8p z2!H?xfB*=900@8p2&}Zga_0Za{TJ<}rDQcRt#a*w?STP~n{{3%Fq-o?S9B>TIqc!R zh)*^>JW`j4In>Xr(HL1cJ||skpSEGlO+-o3w5vA7eb$A)n||1uFjkSVHqqrRZui&i z)VuL()KYf8eQX=w>B_lTYjO9sdb5O#9eE+g`%OZRl8-(caQ|cZKlUHX|M!vdf8}rG z|MyGf|H@y>|F)+ipH5*0arib$7}0eavj&GxC$3#8?vp7LzaY|iVss#hL^KE_p;6S= z1SVYTdE&-tj2^C49_2gi+n+hhC+uorI_7p9>y;4SK=u;ul)8T=q?)2>F7PmU^R!5; zKY^R??!Bj#>qpyUk4e01*6TcU+1#z{Gvik}&Mh$iU+HHS?gs)O00JNY0w4eaAOHd& z00JPee1T=m|3g#-;QYVkp8qGfmv&_NqXJie00@8p2!H?xfB*=900@8p2!O!K3M^;- zuNDLK|K-;I^_k!Rz?FSs;cg%R0w4eaAOHd&00JNY0w4eaKO(T4`M>J*WzPSDxqsjO zF9f^P{;#lT#^!tbKlCr{|4#p|{a^O?_J5bns_rB0|5T_C{>#_@D{Y~9{m8h$H6Q>2 zAOHd&00JNY0w4eaAOHd&u#y7wgnzyNzgi5^{@<_##a0rdcv=8gwlM)Kxj&M2wDXP>ACL&=quDWLr-nBlB83v6Sm>Zj)HTOsKVRxb+M2r*hPW=IWyubKRj{X*>56`wk15_eu^I+zSLi00ck)1V8`;KmY_l00ck)1b#?h z8TJ3KDh~UY%dU2PV4%DkKKJ@ufC`hg-=x9b!`_L~vin3w{hS_}Nt*B8BeQl_S?tgW zo8G%OG)36RmI*h+O)rRSkqxPcDkl>*ZLZ?Eh;B*U98KQiSoc7&aQ@B(U)P*H10VS= zG10G@xjAEs-|+D1>1LJkZ!@ezUuT6~nS4oz;P%mk6>QHmpk-MChIly4J7@XNDL5*oYp z`7fH??Gt3T8Obh|w9zj$+$JJ4HD&T-w~w$s&cM;OmoZB2=%@C`An%v~=E@I0VN;!x z(I$4Lqy>cVkpB;nAPHFNB z1u5xo9X`H)_4a|s#G1!3igx)K>Ky_o)Tg*wN@pOB-DI%;nF`0(kk9$=D?ZLH7Q48} zAG;E&emU+F<>iI37tg1z92vadw?-o{f@@snHZQ-uMA)7$j=lY@F7L_ip>(TORgT+_t{HztHOT<(!b-X7lh?3%=Do44?HaeUG;|J;Eq=t5=IZzOG%Y?6JcKBX1c; z#ymq~CEKcOwS8}_t4+U}V%}N1_3G5kO%-bct`~JNu?+5@K3$jBcX>^u?bw0npsRj{ z$J)OHuU_QKsJ!NbX7-gm{YCb)WsAKQ)5|9N%Mb1O75EM?QIl#)4`Hko_)M5yw%D)Q zh__~8sar!nXCudxp9 znZylQciev*_NmI@<7)OXnbp1G{drjmyvH0f*FW9SFWPz`Iqv8t`USc@@9unF!RHBX z1p*)d0w4eaAOHd&00JNY0wD0$6j(<6KSWJC@*mFsyNsOwC-KYqf6o8^`G3#9pZ_QN z`}6+--Ivb)b0>@ye?R{Z`^))%+kbcdpW!d(|NR`|i=6-GNe;ccA{zkeDIv7~#0CHc ziLbPyf6bAHp9%y(00ck)1V8`;KmY_l00cnbe@S2&^Z&1ErmjUBk}nGJIq^ET2m3POH>JsZs%!jD|N#EfvvXo)JeR z6%53_4emcPWOpa;+rX|!g((5NdBXe8#44d|TgTM3xrN)^@877YMJE3OX!0nbno=4_ zLb?F7Q5bQp!YJws!d)D`iK2tUw^GD#_;}(N4a0zTYNDJAB#EL&Nkp~jiV2gDbLX)# zd49Kd@ZV|DbKH05yi2m3j>gc7%>399!}Ea&4R?#yve`a=XUjqx<*DR8_A1*&;gOV5 z|M68P>FjN2e*a6)6Z~I600ck)1V8`;KmY_l00ck)1pb-=^asE9|Et);AkWD(qrDF&=^JY$ zDkS~fo@6{a<9W%)^J9dCC3&g+pMk&uE+%RL{s6aa5g~hRl?}z3TExM5P{-`uK0~IaR0GW@raFi1hep1 zlCkBTtZMIbb|o3aE zWwoT=_dR^@nS;vN{TgS*X$8t92TiI~r2V1z|JQu%;im!t5C8!X009sH0T2KI5CDPy zIf4Jv`v12L|MvNRD*xs6f7=&O|No!+rGo!32!H?xfB*=900@8p2!H?x`~?M;Gyhj9 zV5!+}W_8k@WScRaF+JI^v;bgjzRVt<+{12l8SOHuQn}4d(OU>jWnA~-S*?3MI!DxC zrMsT!xS8hUL~iSu>c$o@)b-SMIjV7sbv|}IHyc3q7Ygu^i+!9|iO!~O)(TrlwmX|A zqIP`mm(jA!g+BbESHQMhD;Y`NT-}I{<|MPMfxSbjyKh>y8;iM$`WYn{h>U$-0#Iu_ zaa2eu>C~Wo{@IXn&6#g}o&qiSt)2sx<3a2^qcOxUqXaiJ6Am9keEO2mhr?G>-qA3d z(Bu|M1P)(Esl(xG{~vpI9#7@I{*T{G85YT0%a}6NZ7wa8B($i63@M9DNfI)oRECw1 zDJ+UotTrM_=1j|Mks&jYq*mrJQu?X=Ip=%!Ip6Q&vHi~3XSY9H{%Lru$6EJ#-fw?g z_xpOkF4CMQK@BB8hzrD!uj6+O;@G?hqIY{&Dr=Z@NRhh7Za=sh?4zI*z#L>u**{E+ zUP^)!`BI?Xu>#jjsxj9cQxzaL2y402n+?*gDAACo^mR1KxJHBoF`r5C8!X z009sH0T2KI5CDOnOkgebzmnClwa)(&{kP};;s4t6|B8}lZGN&P1z#5gKmY_l00ck) z1V8`;KmY_l;0F{~L;dfgG}`(v`Tr5C`Tusm=Ku5jWB$L|xBP!^&VRfAzqGI4F_rsZ z{eA}y;T*XwM)t}ZcZRk&#<+6o^f2`soQl-`RGPtF{`}n0XN!v zQMDYWuDM5tw}oH8>gK-^2HQxwf_Iok7%|w}_;sFyeP|+yP#|L>52zVV&0vgr! z4#$8YhvWICkpmdAEXsArwfF8KudsuO0p;{Xg>w;M)x>kcEt1c#`;?K?jRfkVg{DP9 z-Eo|}g~i=P8%G*tE^HmEKhSb2(dcyUN4n2cT=BC`Kj3YLO9BB9009sH0T2KI5C8!X z009vA$pqGr|K}19`G0H6|1*}Eb^XcK6MS6|009sH0T2KI5C8!X009sHfge+V+WLF` ze}g^=VW)34=kLLMqEWg&U|GY>EkvE>sq;uu+1)%nh_joM&PQo?vc^9T0CYXHIsh>0 z*8za?|2P0}^4kEwFMPjk04P>u9i^InmNjS6M5m+R&M&%>;Lu-_aOa??`-jY$_X4u|K?%h*Y@MA80xGE3;0T2KI5C8!X009sH0TB491lH33ue=-b|JIuS zx6XO?%ultT;LCyl2!H?xfB*=900@8p2!H?x{Ez}`sQ*8&J^%l}zn}l__Seq;@6Ckm z{~vPU!$pAr2!H?xfB*=900@8p2!Oy(Ca{M7|IbPS+yVa*0GPNM0J!zn06@Ec3;=xf zEdcP7XoY1w7v;2wqJ%+fMXaNzBYy|=kRy(geP>;y{RaiD&%4_S!*=hA)%x(#BCN%M zU1-l&-5phi5qDI7@p0`v0tR;En3_giOZNn=AH??OD388qA`bPn6NL`umV6&-Q2tuvG`($be+w=Xwz z@Y3kg^JhhL1d_~e zU^nP|&Epcu=Q?}ZclmG<%V&n8M#Dv4k|t~HdrfRL97dbWUN~kUCoyDY)X`aF5NC!V zua5Z}!O@^?@8T&_hy_}F7$<@jAHi)v6KhCwUIc2C{4h=nL#9T#){-_Y^(|~w)6(XT zF)Zxa#Cm-ALAJzk?Ht`5B7##>huXEy3u|L^tS!3e0=GLaGzECM1otx)%^XpPvx|-& z$55-M)XiG|Y-F9?7D2!H?xfB*=900@8p2!OzkCqT1jHUED+?uBy?vav=`v{~%) zD}~fvhxnY*dwB_3664L=_BIRlNXV5RP8SXutLa$CQ7_)?T5YfU>|pYT`NO_DxEG$P zFC62z?BzmzW?NXqYlHITfa{(@-7M@Se zh`!u=e6Qr@bI;lGpOuZv2Ry91C5(TzaQqxsz0H+_bJ zFZH&Ad4NaFE1eeti_4cD&t@p^oMB8Hn9O}qX#K_-EhrG?qcHK-N6y%a|~R(RNAEBz<&1DTUH2T!iB z+@pGt(ZSqVW7m-wvHH^ze2aGXI_6y>hdAjQ7#z#yf-gy>D`FQ7KfI(?+Bbj3UQ+DZ z@zpU$#B6g&!No@N}PF zwgbY(TAfmEXpb22V?!B^J}g(TNA&oy!3?wU471`HyiS*p^Y@-q-)GvcY%z~}ba?AU z>SMZ^t_M6O)NnG}Vs9MYWm(&lZzyt;ieGnkJ8lO5s!R5$_lr+VPtQpZQ8%f4sn{$n zjefi}4OavLAOHd&00JNY0w4eaAOHd&@UH@E*#G~mTom&!$NwW%kN?~KdikjjQ@M^ef(ddVafB=@qfx~rT>xs|L!Sd z0E2BLUBNp{Ba9gAZTz}#!~KXPlA9MH93SLKAmDX839F3(?{EwlayXuE8aaR=%c5L| zTzl^>@(Mec7*I}MR5%wAR!ux7+#>n>x=$HN-AJG=T4-7%)E&pkTUgv(v~i?S=EByo z`U5Se5{*vhex&uMTh$rj^922 zC|3OT0N`2HoXPhG0Q|o`07&@F1Avt84*<}HB?YSw0F>I)`}+^3av!YU@4z9PBe%uK zUU}orn=OtpuADkOO#KF@BDFu2X0VrMoIASQi(hXus7y!`85l=hQrGIOmgCel_vr9G z;TNzpge&nP#N(+^Z9}*PPl6JPa|&6;VDWg$3?hu;oJM3(QB#O2n)rgm;zf3JsBx?P z|5Y6g`Xq#%zS*3=2lI(W>H2_W4L7$Cb(*KnBS~d<^YkFjZce(-O1-P)zitDHY zmj6|Jp!=0YGZSxVyK7?cDxn--n{p=J=r^TAsJM4pyYbU8HJ7#?lr<8wLrD(wEwr8V z_4N2?kX99W{)m|-QwCOttA~~TruAI>+dj=mC5^m|abl4x&QhA^r21a2EF@|0EwU2R zYCV?s4TQDiW|RF}I})BHc3R@pya+qc#1UK>DaVtrTH`m8=rCk8RNHG@AqHDZ(!^lN zBryy&3{ROwXwkN{q!3R6EqWvzziXyo{E$ybxPo-5+p}H#`LzeEkLHKlN1xDC8+?5? zEp%8T+%vMeFl!x)#jCLd=Gh_cB904hAK1&ikW}pTqA8(H(S_sx|Cdz<{{;dd00JNY z0w4eaAOHd&00JQJ-xgTQ{=c%on)mHqdkh0g;45C8!X009sH z0T2KI5C8!X0D*rJprQSi|3}bsZrj5iSW~Iv^zOkrrql!el{?;tavJr}7}(#xW#IBe zX+g}QJv$>oC+W`Oz^y<<;}6^}sfK!}`HQArcD8r>Tg<$lQD0%qur@9h;gxp35pl%z zvVer^)jk#SJ7e(`Izy}j&(d%h}(Hy226qA0IlP2D>?@Vtjn&C{P_ zRQeeYzvb2|`b*Yby=41IqN6Vr{a~53<5cDRr-*0f>Bbpm&k~b;y6TOtkxh8%J83^^ zo4Q_Xuzi6jb*Pkyzf9N2Ryw149+5S@Nksb43KESa78J z6YDJb<#>-VwB0JtIfa|8FW7`v3oGzZ7u2 zAOHd&00JNY0w4eaAOHd&@V`)ihWdN|fBD(J_5W{m;bb=mV+z{(|LXtubY73s)9x49 z9-T%>TG=5rNgm7FZFaC!iE8SeJNZT|-IstSMCo+(V{4o3&4+3GoZs9rPH#sERyf4h zyyLKaWGcE>;`X@${rvO7yplsvB1b~9I?hs2XPZ_RD`+oRUz1lLROMo>aA(V%;W?kQ zthW2;(ME#L%V0hCf=`{Lp61JJ^PfX_((bYOKPWGMb;NDwrcm(~iuvv3`m2-9C+0AD z=&$NAtTHuhbNUCOUSD?ek=xZLu<7M^(b45H#xTS-!EQl=c8sps^egXzl6+4QrAKfN z_0Fm059;Ti`&f>5q#3Oq05~8an7ck&L_S8Ve7;Q8prh|qR`*eC$TPOAbpb}(S^_f; zuvLriXucKL>nCor6noIV$xzqRVy;*+USR*mFWI7n$(WSsKgnhL`V@BW#r;1hP~|mn+yHGJND1mg=bT zMLEJAhPIe;w^N7(A9kBxcTD-*DdZ9#`6wUx=}gu8jt8lzam5&SpOU!sHM_DEFUoG9 zoSEpYOStI6To}dQ{OZ^vwItyLJF4DOyA=T0T2KI5C8!X009sH0T2KI5cp>SYK!mr{|67z$g(p|?KSRVl>UXM6tDc)yIGTU zI@(jthVLHkB!$dB|3F~l!*2E|<`CE33o4}-4t?bn@_$7uaF(e$Kt|Tpw&~qbb1rQQ zCbg|xPRSzL551x@PGp~I;9lpWLpso##U@lDTX|@njA)qK$yQco*5$is&$xuSx|!IX z#{{CYU8MbJcu&M0lz$fT^nm%9L(7!O@wpwlE(To49~QIHxHa?lGW z-yv%{orWik#=R+qB7%pGZxN0-Q*hm<%+EJ%yI5>sqr6IF);c7zcvn6$p||~lqy6{n ze}Ub-7im7zJRwYc`e$zVHwb_L2!H?xfB*=900@8p2!H?x{3!x!nE&Ua+yL|c);RyK zXv?h4pK@Q}LqPxpKmY_l00ck)1V8`;KmY_l;2#D4XaB!WpH`NI!7`R@T)O`X^JICb z)TTW&hS@rI!gss({_<2}L1?gr0}eT`PB@GYawC}Fb=(M7+2mj1v{c9@__+57qY62R z&2`wd_wFL^-qt5pt@E~y!yka|BJ8?O(QbJ4WdN0$oLcl<`Hq5g-W<%&<$}yK}3D)%2N4^<@_jDhh+W!dENvD zYMQyna|T$hx^BOE<-9L*owlDI7G0ERx6&!tCL`i+OiW%s9!OIo>)m+%tcZ?4lKBnn z2A!{YTq5~gXHWYsA5LQV%y86bxadpLWQ~2ViLHjiXp`9s$1LO|hOCS_I*SbA%rIm$ zs%->EgSNekr%WLhXz^j32wHpuw*gJ8AV*{}&RW0pQPD-SEjE00JNY0w4eaAOHd&00JNY0)G=&OaK4Q^#6MQKe4DN z)<7oaR&c9`hP{n$TJza$=Qcg)lzt~3nZr?-QY#iQ=W8x}&HOcSArHk>U*?P$?JwyS z{B$`aH`GS_R_?^3`C zqZB#<^eo@c*iIfN@Z@!cW=RR|kMc53?QY_nVijMRb^aSQ{0Rae00JNY0w4eaAOHd& z00JNY0)LvoTI&B@!T~x5!FNtMypkHxSm6n@#p_?MQf**lCGV^CIj(6Gw1mq#RFzDw^0x zqQj8YP;IYqg&1rtNfU!5lf*FCFg#@zp+(!)l0rNQwCIs={H~dT@k2f#;R@2JZqIh{ z=hq%s;&AUuQUU(OrKW{kCQv zE1Q(s#ykB2JE}HeuOE2hrA1ha1G~_kuW2S}skZT|?|m-z9`bb}c1}!ep;Se>KFht% zZl-G*8z8WLQ_XwDhJqlhl7>fyoR#?Z?ti1z?*EU6Q&?BK|1CyJzt{hnE(sDACLSH$ zulD#a-NKceBA5kUWoe7VEu13cvT)WS%W~KQfs}eAiG{Nc$!3YFMO68SJ4h_22uUpR zkvO(fgnfJ?weND(r)4!-vmUjzFW3)?2!`oVH14-o{eA!cMms0pXoWc9=JnJglN@Y5 zrqvxCcE1jjJ~!66y8plBD(wINZK=VZAOHd&00JNY0w4eaAOHd&00Muaz*^4#@4Ve= zDJ3bRj*z!Ec{X`^SPN;si=Z>&wkv3rQ?%0OiNQu2*bG-jBBy$p)M^4UMn6eaSjKZv zPKzi?7_?TzIxgDtcTf+R<0u7p)hv)68=Q*N{#2U5UjF>t(d8oidYeII zLYm0HB^J+xT^!gneitiR9)*2*(F` z5(s!5Pr_<2z&jiRh8&LPn??>`$g(Kcq32?t{jap!5c2=lnEyA$GJ6`98VG;@2!H?xfB*=900@8p2!H?x z{MiC)=>Ly$-3I;tYwZ8Gu$p!Ivu`ncJ_vvS2!H?xfB*=900@8p2!H?xP_1GA-)Cof z%wM$szk3Q9_;dRIWgpF+gJlK+AOHd&00JNY0w4eaAOHd&00Muuz#8iR&;LLA|3z7d zrV*Lq22mngWPAz&^N6_3LM7ZW=!Q6nb z0QCR=*=rm=9|S-E1V8`;KmY_l00ck)1VDg_irSLK^G;Pq!?*l@`et+f9?T~irRxKh zHQd}n)M=hNk0h1d&C`Q8yE*AT?=leXTA%WkF|fOe?*-rFSr-5IeNp%7hs2JV5w*w^ za%8GOTF4!f4S{C_%9r!A+%0@Hd9hDLEcBAa_v@N1o@aH|BdP51kk>9&PFQNLn zubtUPm#yzwwG#?QWmQ;d=-!{Cq!1({pE5=}pIxRrRxkdKRR4D|WS&2x`XAVK5#s;h zw+sY800ck)1V8`;KmY_l00cnbM-ZT)S*`!a3FT+o_OJ)mRO&cwb>U<;2xAJ``aYD? zsE5YD{{AfkmnTXKVixV$83{T`cRZcfkMHdLcLno{U$f8H@49f$LnWT&6YFM= zGRz)icp6!Lg{3;891~Hla0|e<@6gIa>s_*coc-v{Y@^}Mrl5@O;0SFy*8%;BzBlI02`{fKlvvHLW2Ind zyTp4_ugdXUuom3dt=cO}ZcWiYyNUWT?M~hNg&$!Z!Zm;Z2!H?xfB*=900@8p2!H?x z{ILSm*1v!MUwK2YMiy6ej3BQqj~&LYxJZ`$zU!fDlEG2O9pd<9AIcvj>ZZz_x6f-q(Ndp9cWm{MP}18LI;Td;dNFaQxcm4uQ3t z|KE9gjro7xoWCvqeH6Zx{~1|x$G?~V=wHi!zu%Pq55AZGiH0T5SId9pw$i?S$A2#W zL;tn>f4*A&7yZ5bpZr$-7yYgLx9|)2^YZ`H+h$#U$8CU@fB*=900@8p2!H?xfB*=9 z00@A@J7 z#yGLa6=x~Ub5eaTR~C{q_!e1-X|*29`v$^VaMg{~x-5;mtt+1V8`;KmY_l00ck)1V8`;ewV;n>i?b6>&uM|%`RIKEbdI- znVzWLbG=D*U7EE1`4pSem3Nw?<0Mn+YlF7nYI8Y?!^8sL&%~B(OuBv{Pxh7sYU1qZ9;pltVExm<;C-R9J9I_kyBJrayx8o`}LGhnd6`0h8j9t^gOG&YNDMiU!I{upc} zsS<;&AkBFa)KKz+xIhf~I)2w6j?If8dbf9_vW7{A6sddc_JgazJ_X?Q}s~9Ud{?E^B_<_^JTeaW-23cTDYu`0OKtrwLmJ85w70&-|_%0WSgp5C8!X z009sH0T2KI5C8!X0D(VHfQI&a{-2)n-}3+7Jy^$-dcePO$Nww;Z*d^UU(xsjw@a#_ z9%}xgsh6GY-ToFc?`PCk7&EMmi$!>)-ETx3alI@c;d(WYe{h9xD(A#w-=*f;TTI>1 zR`v0U8#X>!7i&`y&0Ma{ad$Y|%HN=fny%88Yr0;jJ4~Xf#ge~!hRUq6KFgvuV4`LY z+o)ju*>s0;d)0@5hW5u!~k%D9Yy`h&%Xx%a*Rqp`yK$OzhvFjOSYdRI{H%450+UwPF2o- zig;$8{w)D8G1;f9-sl?HgqOaP_M^6`>%|7!7l=}aN}2e}bdBuq0f4fmH;Kr%0Kmo) z3k}!I4HdWV#~QU%Y`Z`8cyqzJ?*V}82UOd-H+%~K46vXa3-Y?}rn?#d=>07Ku;}4= zG?S~0-;#`kWX|SZ>!yL7bb-ZEELX*%;G62)am-p)5m z)p_a+8g3J&E;cTaqt^@`jQH4g8%i7t6px9<^=eJ2ZFjQh6y#uNdxSm4DQWUlocUzt z>kNl3y6cal-`31yWs_3dc&A@rN7W|m^#gCbvDl+HO(X~)iz%Bz0bwoL%vSL z&WVXFl&VPAXSvte&2&v;0|eG@s(G*2P!NPw((uTTvl9QB$0d?)boR9G$HOVCpBau? zjFf(F|Ic(ukgzcE=YBKN#Bz#|#3CPwV>?CI$M=8I{~ooqFMLb?3)7=$+;6WEnW08~HFOf=xzWza z_qX)F%**L&bN>WB0 zA#ZQ;Z1VK57Seo|NN2>owV+i_(MsPg1{-Z)Gh7*ooa$wIRTGdg`boaRGM%=wxNUo(GAT*yOl)t5OVM*B;8 z1wUO5$qls;zm+@jXug<%dA5q=Gm9vqXwk$f(%3ZOgccvfEqD>wP;GB<8fft$oE2L9 zHO?D@y^H6YLiV9;D@mKC5Ilw)@xsY>$l5;{r<0Q2*iyD%jsJE&uP{%Rhe~bQLt~h&b0>Vad+#q#B^HDRTR0Fg{q}8kk#sbUDcU#4vfnn?;p7XNaF3DV8?gDX%emG0OSu z^2FoP{{DVuxrXRr6Io4mxfHAV3Pt*zH*w8u?^M>i(0y4izd_iyXPt2V-cI-YOK5)P z%hwj-dOtOHPOji3_Z`jZ9mQO_wthB+`(StcGfzsR{r~qZ!a}*4l;&wPQc0fpZ7NlzBveh00@8p z2!H?xfB*=900{h80&D31|Ew%v$dr4(b%vHSHWczM#6$U80D#Wn)c^n~nWLg3ZnkxX z5=L73((Cr+h7Mjj-c^{XF3LhQjmQ)?h!WW%<5LirN5pLwD&dYnH^d1A5%sMrOXV|` z^P^lHlJ)!Nc@r3@Y33f!8DP2Uy8Y^v^S;b=+J3?pU6g3I(ka*`BjRsNOkO`8NK+&0 z-FW`2h>k##`3>v_o$m<%T&oEH%ZHO#Ruce>hKs%=P1e}=n%HVMj5e9QaLhtZV#vy< zqqE2$&J06FquNGrG-%tqc*+!FffgUeiJ-+ta2wFX8q%B>ff^-0jMKu9sZp-Aq)khG z3tQE+wE1HU3wt)P9v^;?Epc2sM|X#a;MCNicCGWm+87;ci!Qpr?am8L0bVY_{Y*tO zM-<}hqT|Og)ap!AkpKT@XA($Kv>Nl76{Mm}YXUOfRodE7XM^7v?w zRuy^vh?yo+23Ciwhn4=O^<4bhKFvrajl7LM2KQePn?|BmUNm?X{ zj=75U<38Ea!~3(&2Fhj{r<*f=h(g%5UqVZ4uH-PFTp9JH=FYzq_(35~t_qi-%5&WC zJl`)V!@u~3EQTCJ(|Z>(+ZbXcpNG>wJKgSk=_NM1YzLp8zy~);_kU70Q%wwMM>!p1JyTVvH}x0Si3&sWS($33$(1cy~Bas!E0S0pY}Z@ICP#{S-g zG}18YdA4<+_lr+VPtQpZQ8%f4skU9UH2z6{ao}r%00@8p2!H?xfB*=900@Ai7b{&S z_bA*hTSZsRT|3GBp9AgBNjEQunCvWgl!FE4)MQpoF{nZgM{RhF}TlxL+ zuVH!56|m)Jm(3Gew>C($ZR+UpC^s_86nP$b{B;<|U6;BjriVp`jpB7enN6E{#onC} zQMii^uCl$5`{{*m`kTHTnBLZFGDe$E?|nQlPujPGNsD)}gsxL?AlIoO=c}{4^3z>b44Exz~BebATfi_qMs{!4qCy`i~IW=@6d}*3T?U@!dCRWWIFS@ zN8`n>mtMztO|6gXeD$sR5BOI7SBc8B(ydnisyrV?lc}7~H%_0(otm+u+TwZIJ+a`G zYW6~C$m&mG%BC*UCj`gFr<&zY%4hgWx;$pgNdAYm5ZSW$PLJ$6Dy%pt@bxh9;P$6h zeym*4$?DsaL`hX3m^ht^QM_#xdvkp=!ei|u8HiOl_Ay<@Hf$T&xx)4@DDR?WXxmt(j@T+5;c`I$ z1V8`;KmY_l00ck)1VG@Y6`;m_&;M`GCn4(>!$^Nh-UW zrw4I%bJBg@d0QikOSb{V@-$dJQT|mwFH=jw*1geHI+;1xP(oYWmZK?#e7my6Sh|(2 zeRRQ%7M?ipPyPSutbfk*zdDl7^q(>Pk5z# zU%Pwn(unh=_oE(P_eCd3bd9?wD&4E_p&$b)*axI5Y;7&L1vf$_8|QmuSp|CtPZ>p$ z*f=RjHe1wtgm$y-FQgDRLN=Rx3y#f=uy6B7?Yms{Y1wPZHdV=^;~lm8)#7?u12mPY zVV;ig`ag@!S@CM z5C8!X009sH0T2KI5C8!X_^|}m(*Lhqw8sAbmFoz>c7I{Kw%(0fIa6=>U&RNyUs*IW z@s_r`CKj&}%JH=+XX1^1Q%Z!2d#AMxRSCfB*=900@8p2!H?xfB*=900{h)0@T*O|NOs_ z0C#|;l%$M0Lf+ow+2rYAEu{G_k8^LGB_3R11@nx_qtlLK~iPIV|eqOI(#XtmzODc17RA!N~m=q~7SetYQ4 z)FSkQHlaONR-#YbNEO+2@$k|}?%kCh?ALQ1J5tP~C3sTy`#0C$GEC|}Jh)Tqv1yZ@ zn1iU>!3Z4@%GX>Cy1WX#ac4ovTUQ4x({A|Wsn31kbrNX6Zgc849ra@69tp-Tjo?nB z88FyjeD@n%4+dLC8kkmfuIYAE?ZTp)&g9lvW3$L2*4z1zD| zS;M45iqt)J`@z*<9|ffV<{)Fr{$X15N@|bxcDkUg4v&~`mo>j_d{uz#IGZhiJEnF+ zeD;yS(}b;qjOYev0QiyCJ6sD0fB*=900@8p2!H?xfB*>mtOEbj|6lhl|DR#7R3XQ- zkea8`@!XsBjNw#9XEr>n*L#@JE*-79x6IE~lFs~yL~$9CxAVh7!jD#bcszy;@Uh+np>r1vwbn9$}AhN}4Vuh?)u~Cw>9%v z*`(Aq-suUGucaT_4 z5t3NsBXMk}2>bZ{CjvmDHS1AZ`-1(Th+vo=MdN;ZmB?xYz*j>jF`gUkoP47d;)t8q zQ;$q?u=$u)cXZhOI!yZ9SSRNc>j9?O^FQm-g6|CiAOHd&00JNY0w4eaAOHd&@B<0Z z(609Xj}!Eq+xD;r)>P^^y?d~ZDfNJV<&O8EoJKt~2KM)F8Mr)AS`f2n&(28DNxHK* za4S&J_ye~~s-Yfg{-UXuo$cNJ7BlZ>)K?fYtc{CBc%|KML>zIwEFj@}HIRRBg>Wk8 z#N)@8-Zw@{tDt0U8u{0)@AhwydtD!3nSA}wjESs9YCjc?)zcfEHsND68{gR@p=Z3P zWUOquwhwE3wDu<2#>=ieioN~8YJT$Vhtf0Sj4y-bPo&*ZX%;}C7H(FMT0AkVhX#84 zl-WM}d`z1xm|y&wZEr7o;hwKb;>`upn<&cbS5x=S4m|H+RP*%b7?pm;!*99uivE&y zS1;LqlIZA5ML$?(?Ko9A|0&{`dAf0i*|WrCpRRhNYh)8%`cB%9+NQ1-8*E=7N*yX? z;xE%RvX#!Lo=0R&ZxWF{w1PxqiG_x1=7x&f_hXG(Dz@F9dc3({okx0BE5rH$)wb>p zsXd8|0Tz^FL0U%fvcMemUM_3~jf{ zb50@Va=eEa-ZWU!@L|mv+9Jx`Y*wF8kaJmxJN)=oU)x}LV&e`i547GT`&g5XmL=OX z<+|$`-NE77519w_CoqHN&Cg$6StzlZr)Q-|(|3vYrY6bpT(G{ov0JrQlpGa((|I%X z3Y85ifAI%ek8mj<00JNY0w4eaAOHd&00JNY0)LFaTKfN$Mq~cv_B?{uNxG76j(>8rZckUjyKWiD7d3VR}vihYy9pU6m|cQ zS@T|jiT$4MgIKFH?WRP-lIP+OuQmW!_yu%NAp;m}Bk2m> zVH#n?U~l8sc@p-ai6oMn7a<%UD-TWpQ+Y6&7S#V?i{=;2!H?xfB*=900@8p2!H?xfB*>met|XR|1m4AHUCfa-_QRm z{Etik_|x+LnrUY3e*f)&SAqZtfB*=900@8p2!H?xfB*=9z#k&8mi>R_-D}PNJMi!4 z|GE9O^Z)17sV>SwG>ymbm{vmGi#Lb=rQy z7hRNSx6&!tCL`i+OiW%s9!OIo>)m+%tcZ?4lKBnn2A%H-fLyByfXj!ISXL7NjfRW9 zBu&=X_nO#hIE*%#y>QGzPGZQ)sH3yUAkGX!UTyOq!O@^?@8T&_hy_}F7$<@jAHi)v z6KhCwUIc2C{4h=nL#9T#){-_Y^(|~w)6(XTF)Zxa#Cm-ALAJzk?Ht`5B7##>huXEy z3u|L^tS!3e0=GLaGzECM1otx)%^XpPvx|-&$55-c_`>%8nieFy7z9871V8`;KmY_l z00ck)1VG>q5%{0{|Aue*|Mbn~{5_aYG)mV8ENi&Ag{ad!bskA7yPKy6advakeOBt# z$l}s%K(RaxmQR#_)z8b+Qm}Pzbd^qK4mOm~7PsYSiXq>wY%!K@rE4EuaHEAQ*Aas4 z{=#@|y&Jc3rrz?uiVt+ZvS?=FEp2yAEM6s)<7-pS#2fvlln52~PHQ)QI;Q5*)`PM} zVsF3Z;$^k+Vgi%51HdA1$Wj(+JC@kecs(x7{<6OR_nvx2LNjAs4|SW zqni4C0H8C``7fUTN4E$M0M@o5;ng4j0w4eaAOHd&00JNY0w4eae}n*y`nUOiaW9

1eHzgktIX=l;@k+i!bfbbVuKROYmaFxkgsbz6iPpunY%>Y zLm|If+-H++mKFzMGTc|zPS3+T>-uXq^~u)l?|pp=k3PysQe7#Yp~dlkG5-&xN;6=$ zFAL5K0w4eaAOHd&00JNY0w4eaAizojAL{>4_y6$=cdzT;pUS~+QnB1r@8Mm;-v*ca zNF2I}vqna#Tx+oo4w970+)X2t9(qIak8E1Zj}ks@9{1p<@P#ST^$xgQAq$1a&jy9b6E_(RuI#Q)mN5C8!X009sH0T2KI5C8!X00DLr_>TVn@5}##{{K(&|HS{G z>9gCX1?L3;5C8!X009sH0T2KI5C8!XU?G9e`~Nl7@~nzEB`bb8*ds6}io?=XEUR*R zdy@;MRlH(k{aL~m_u!uuQOc_5YUPK7(&3>N^j{{eO1P+`8%e|7VQ*{}p52 zL0*9zo4qC9PT&8hR5mg0|D723|3mFhHzl}~UcjBo>;v$I_*LZlz8H%Tw zpR^D&eA6u0xmR#wej#z@{vUOHXsYbB{S9X&^HdM}M>p>+_=&8Fe4b3oCQ8xKNCbsS z&0`MzxAx*6V{xRv!~e;ofe|z#6W|e5h(MM_Q0`F&N6~Xs3Ma!NWxGR`$0;>$Jtp&Z zf4ZQISVU!Csvu!J%SCpxxI8i)gK_2JPF63;($;Lfb0x^Cc%}5CdZX=y=lqu-d1zZ% z=%vG>fB*=900@8p2!H?xfB*=900^+1z~}YVH>Fnlamb zT5wHG2iU$)zEX8vDU55=7SAL+9B{QjRg|Nrs+-#Sw9fB*=900@8p2!H?xfB*=900^+1 zz}NNv{cq&|VYeGW{@)Mg|CJDEmTdQF!GS>l1V8`;KmY_l00ck)1V8`;SV-WD{J(vM zWA}O0M6YUX734MWms1Htd0>p~98_B=p*;@uBmSNNcbZW0H_OoN-uFf$N;G+V^IjU5 zI3GNlgS%^8-QO6cVvovSBqNrD6Mx#aQk||D!s#6=ADLjE7%jJ4cu#A{t~L|PKOXB4 zmJ4l~Z>}YFBqeCBpOf^vLyAsjRZ0cTI(aTU^x9k15_V|@#x%>~qM^*&HwMnr6n)-k z=e#{(W-7%)k2q!6o48m&NXPTf-a*|Mg)Jo_Ve&CA4^T-*mkl<)981-9z9FoD+Hv&V zvF6C%3vvyDDo<_t1$+7Ta^GQe2NrjS>Q8c}qkXWrSkf?od<>a+hnh!ZL;>&<$Wf#) z0-4bn(EE1_z#MF~EaLDpkGAvUQcH8J%!WM+w+@d20w4eaAOHd&00JNY0w4eaAi!<{{~yo) zN3MkVf5!ZO#9f*xyM0-3UJw8Q5C8!X009sH0T2KI5C8#I68Lcc|G=1v7UAoh$^R46 zzR9P4_lfZ2sUqLPqpImi zHLDf`YjJekCtI9rO)WDGHNJH=#h{*NzocBWZvCX&INd!c<#9XKVx@55??3epc-^K= ztZq@02s25{b&AOPdjSA}u>e3A=}00uk1!VjR52C-kTHm!Q8Xt)d;~3uXz0QhV{wtB zfl)N~7Xbk47y|&mMS3#=08ILr0RS~zl63lxKXg4+46sJb0DuY10k4Na#|y%31Stni z)shr4l3X`&YK~gbtXb)`!?S<@2!H?xfB*=900@8p2!H?xu$jPrKmUJo`v#c*|H1kH zy9%_OZ1!QnaX|nCKmY_l00ck)1V8`;KmY_-O5i*C|J4=|x3~xYtcX%pMOQ07B$N&h z&7S|iA|yzmfsy~O!pQ$$3jP0#{(n0W+IE(D?eH)l00JNY0w4eaAOHd&00JNY0&FHQ zTmQfI?EU{8Au`ba|AYPiBafl~pUwWV;J6?F0w4eaAOHd&00JNY0wBOz0$=3+KZqHO z7Thl~YyQ7m{qSu0|Fqfj{{?6A|C2Z;zAyj(7e@Yn$$yjozbLrBsj4+he!IW1teByE zdq)U@rr(l%Ye*-!{-6xb;@r!zcUP8B-Rz_1#x3+|B3K6ozwO4C63Hh?oQQ@_d=eHH z&dmScgv_j=dJ;a#|5rgY^x!A3)&8V~Bj|V7YEH!A{?GFN3%|(!m-svXAAOBT@tGz6 z9~ns7%33cTo(2R!00ck)1V8`;KmY_l00cmQtpvWP|EKr=InQ4IAE~F$R{#J1wf~P% z|2NLm|6ZTg|LvdG|AF7E|HlYq1w_vr)0%12YUqO zL~&TUie*)9Z*OwJw2D`ZtUpWmGXF2qpJPgyKS${Fnz$<6@P#Q-^_JRk@%B2}vCdSV z#S8d;CoM_SGz{OT5wG!K{a>!|5u2-6-GuVmV;T$O>lzOQ^)uK1se35oSBv{>I?=Jz zpY&9(R770Q!#nHxYd7`D*6r_oeF~30%1BaODW0JfT6RCkBDyWL3?Jl9VXprR>OUhF z$6Wu%OTQAF^0;kg{h#iFRxiKKiPcZk;fk7Pj!NNVSfp%s$nrR)=B>wM-tJEqlo5-l z>`N6SjAywl+bk}ROvhkcxwwW227>jtT-G z00JNY0w4eaAOHd&00JPuasprW|HuBnHUBR@GyiYRvh)8R`~Q{y_xXQ?f1Ur|B0w`@ zxpxl_1Ogxc0w4eaAOHd&00JNY0wBOX0w3=Gi;THfi|}=7?t5Tc(gl?YcFK0~h72@qJa^#9q^QV+!`n`v0x#lv*VNhRuL$vs zGs);}iK^ZAm~Oi@Sc~38>fcc>XLZ`a_~aS2gAOvbt~xf&iio-lwC7%9UPHAbi)1HK zoCohkoHbM)t+0)(brvbpp~>wH4U^NjW!^ebkUTY*=~sHIt)$PaM)FKp{ZieZ_i5+c zA2R7gYZqEQG?sVP9?vjX9_{J3oAc%`_^dGuVu2CW4Q;Ad(7xoxaUt~x2b6{Tpw){* zyb{mDNpGLyU66dtiT~Cv{A27X#_j$HW8VL6AD#=T@C+}9RCtar#^NGL1EXkeq~m?+ zATuDKI-ttUuiHNK2HtRa)oarZ{ms$?HjbHk?G}|x`*C!Am-VyhtgWJ^z;D5HoA*UPL8$D+^a#U zBs-Kr+Lc(5E*j2W)4dnxl6Ys#J9K9R2eLS!RU0?|!N4se^}_a7lIoMA#~f(32J7~k zpacRrN~2e2V<|cT7e!LMH8w`4^Vh2A%7vxBYom9y&)t|`a_o|cw0mG!WkdV%j@S0r z+?2#p*VsRj-to&d^j>VWI>LMy-HDgRRwEG&&+u5J<9U+vFxu^tp8ztcR8JzA@!x%T zK5TUqNrMprXyg7)dz|F`)O~?NS#3+MqWCuhFg+O-|>g8r-}jA$j!BdX99D; z>tWFGf^Zu_il?bs((;U?msn2CwiC3USnu7#6M+B-fB*=900@8p2!H?xfB*=vkHDAn z|9M}{{~Las|HnM}YW^R=xg=$`n8m_H4yc4MiM1P6r~ev+QeF`fq|gxZW`l~*UkDzl z3g>906>C=L8A;!`F05LRdgVnNiEbuUteSN~K54@|(W!@OV?Fv0)8mPDS4sV9b30T0 zqE&T&GccxE6qF8SYL*O~KR_FMS!6NF>yW1AwXoyk{C}wJ^!z_hfBek+|J&*L|BmVT zf34q6x|Vbtos@EuuCloFq=nMdBcN0*i5RV+Hewlr{SpWYm6}JCiX^r6;x}M%38Y~n z*`LHuB!`j)hSA56j%8FKB3bma`G3x|nfZTi#{BTI2%^u>H`G5af|3@w@TWZY6 z|BL=S|1apD{J&88r}=-nSy~*3$#7p;yKm+Har|Gb|99Cz{vYdo`|v~{00JNY0w4ea zAOHd&00JPuP6A)#|2>HLcK+Xydb+=7z?~+P{LM0SyZ61(h!Ra6-#nUuiSxm;Ik>yl z)%}f8D)y-SMKWSZIKi3xza*B;|4U+~01OkzjI93}swY9}{NF18R1gh4_z7&aKWX6z zbNZhXak$^3?fkgZ(i|(ZVUNR&h0&4v8wzFXF1aFa_>=r{B>px3Z*2$7kexm&I4cN% z00@8p2!H?xfB*=900@8piwS&D|Lg;x}tL2GhGcv_v(sy{sY_{TY)_(K2yi+%aezP{unf{p3bDr~H-$$rafi=7sr5+sAlvvGZ0Sqjt-- zoHVKu6gnKf_S^yAcRFQT`{H>l`L-rjI;7n>Wh^v+N;Rs=l}&w+*LCZ(0QdW4^J>qh z>s?<|b$0$L=gvyZ&6bejE4z^8+wlFRX9Z&R|G8dwd}BjPq>M(a_4BY>$h3x~{-p8$ zv;ffmz{drEx>u(c0CIV5i#C!Qm@4okG?yDksQW_8Wz--nu7Y{> zPo8xFp#P<>765k6EC77?$pXNq|11F1|F{4!eJRbH#ojzT4hVn%2!H?xfB*=900@8p z2!H@P34C4uKhFDB{V%-rN9uo(9rbcnryYz>o>4pKAY<#QW7DjN=*mEQ?ltB$R6DXr z?ynT*!Fv&B4V6bLY!P+NB4s-7|A+d2=l~LRCZz4>v=0ja+<$NZfWq^c?SHL3_%R}x zJE3i=;vR=7HO46Z#l;r=&C&zqA-Wewi2r5%pEyi2W2esw&I$q`00JNY0w4eaAOHd& z00JPuVgj@D|MRMe&N~0^Y&OD5^Z!CRo`3cZ>c%K+DG>>ik9m23N;A;xI0vTk~1CcgT=)%^Z$+^Gw(200sfQ! zHxJR!i}%Lj&XX3>(Q~lXjQ;;;pXL93fB!#!Ic*P%y?J;X5C8!X009sH0T2KI5C8!X z00DLq`2TqSA3_!O|DE$+vLt}Em7TsSI4cN%00@8p2!H?xfB*=900@8ps|kFl|BH;d zS2O1SHTONRE%N6ZmiEju@#k6D9dk*}sYib2Sj?vI^-n`i&q)_lD%dI8#TzovwDH`5 zCzGNg7Y=VbfeO5c>s?c4r@tb^GtMNVwt9IND13vIq|F_=q!i)e!G0u7lJxz`g0tty5wp4g=}Kj-EP z@T;P6g-?fldtM?qm!#|#vsk#u0hJIYv3A4i^k0Ke%J)Ko6dFR_Y(NS96}f(kUyQ^9 z52eFq>FEKAZFD=CKZ|XNb5(;=-+7=6(z1I*x@b6iP4{Owm&6rg-l4{U97u1;x7xV* z4+c^yn+n@sIjK*M4z)ksl;Bc&0e6Ov(|4J;nVvg|izM6asIf6RoxfID4;7aFu5F~t zMsQ<(A@P!lw0mF}>iW>}j@R}#oR!Q|J?tM@M=D-J@5NTDBg{w9op@_(HKWV_IUb92 zOdt)=(Kg7>eggQ|{Lk3@7fEXE!_V8}{!V-ex32Iul+~5U3Cu{Hfh0y=I_?p-B%QwF z4}DJs1FV6YYYPt_=D^)7ZOzs@SAwjHS4!8^8*MLS-2b1}qnWbPR|RJU0T2KI5C8!X z009sH0T2KI5MVWduk-(kIkmNK@~K}r$iZ)NN8wP;lSa48jwIEoFqvJl=;#_NLnQ5r;t+Ocx^*s9}<)U@#C*8*B z?m;P!+p!iag$sZGsdvEZHf>^ci<(53Nn);3MAm|z$g0Ta$)s$86df&$bR?0SN6<(F zrHYzIAY%|cqi9Zq_y}4Q(a`m255Q+X0Ib`Fvi&X6oACpHNgwkEfEupp9{_YcRSd93 z%pU+IFbBLI1|2U5w-KZqG*wGd$VhVC#HrbS9QOaQ+NTfC0|Fob0w4eaAOHd&00JNY z0&FEPOa9*-)1|h7rzHfUIP~_2Sw3?;TTy9y-AObmEA<)Y09W{BO9MgxzWDX&KAEF_ zbI13$M_;J#TyL3pDxX}REo*bv!bM|^yjr5d%|g6;r{5yJ{)kwt?WukGAM*d*bSy0y z`Tud~S0*?f!^R_GGx`6Q&l)LHS{V8NIih7cZ`LG-=gMgm?HZUUNS^A>^i$~=Y8T9Q zJZz+g7b#O;qY&rhwesNnG;>v_6)|d@kAn^583O<^n{UeCv%Eg+|Jz9{ZfEZQ!$j!G zSvU?_^*HlNJP#+meU3*V`LMV^Qfn7J347`ub#Mf&jLfY0WdENhfvkdP=)q55tNlrz z=l|EloRoZV@mz$jT4RxLn7#w0j2HWt`8v@QL9s|P85vAKX-#s<+SKzycFpBVd*(-E z8fGi(-cg2l@*e7cw)(q*!-4<^fB*=900@8p2!H?xfB>rrd`JEt<_Teod+^VSC}mZ2 zwemwk>G06({r@XI^#7{}{RR1d)BXQy?KDGHd-L!-AOHd&00JNY0w4eaAOHd&00QhJ z@OA(H{J2au>UA#FdWopdefI65ii zE?s4D=}8NvsYgJmS`sl@Lv6$g5y%n<3YEF_kI~)Vi{F67C6I=RWPcJrksL}I7)Bps z1_AP6tE0ZS|EI|N66V|Gzv=sd+26%-j9H3Cf5?RQ3f362`M! zmTeH1N2X&iu3S3F>OQmN|7nKPj9Bc&!{dMe2!H?xfB*=900@8p2!H?xu$90p^Z&eR zqF1%H3i2BG%c+E+JTS&~4yvt`(4IqP!~UKDcbZW0H_OoN-uFf$N;G+V^IjU5I3GNl zgS%^8-QO6cVvovSBqNrD6Mx#aQk||D!s#6=ADLjE7%jJ4cu#A{t~L|PKOXB4mJ4l~ zZ>}YFBqeCBpOf^vLyAsjRZ0cTI(aTU^x9k15_V|@#x%>~qM^*&HwMnr6n)-k=e#{( zW-7%)k2q!6o48m&NXPTf-a*|Mg)Jo_Ve&CA4^T-*mkl<)981-9z9FoD+Hv&VvF6C% z3vvyDDo<_t1$+7Ta^GQe2NrjS>Q8c}qkXWrSkf?od<>a+huH~mp2SZeN0Gt^WX5KI zUi`-u0CTX_vWUaaJlf8WOD)Z@G8^_d+(?Oz)Zb7jTX)G7dBdONm!pt&SgYIA#h$8A zTS%lFR(M6R8MG#6gs0Uht@^{WkAIwV36f^ZR^JsI76d>51V8`;KmY_l00ck)1VDhb z1itS7FXp+y$p4eswcelSl3nb2OZPtuc2XXkTN>ZoRnG09$g|tjnHYd~KXi9A;s7K6 zum4HRh04yA=0&(Xa$T6L&2kH84Gbgy4|B8G6yNDr!O0h!XAp0n7&}w{OSYLbzpm6F ztP*NZVATKH7n5e{|7DE&ADi2(<0;Lk|8L)yoUZ>Z3QC7EHA@E0AE1rBEV3Bobx2d2 z+bNS6h4R=qf4xxMFYy#{!z7M&v-B8);@iqgp5|XOf0s-W$mqh5FUhsNd}E{8z1==h zAWp`o$$L*g@Y`;DDUqB+;zTrbO~}kgRK|<| z;~%4pp9!irBMx`Y)c-C&nLY40rgn`{{}*3l)c?LS^*<(UtyZ@dv;Ift5h+JeuVQTm zjb`fq%Z;8d81;XxC2bdLy?A&U5C8!X009sH0T2KI5C8!X00FiV_>TVnAIblVTw1o& zIDDT*w8n?^f4Ra(Y_4L163T0jX)KVhYdkcw{!iUQA-`IjvHmYhivuwk?kj7j=i!}o z{k5C=Wb5|#zCMLVA7vz|t`yH;uKx?Nh;BhXnx;009sH z0T2KI5C8!X009tSF@dk||G%04cT-p$^8bD?|1bSK&78&FJUk8vfB*=900@8p2!H?x zfB*=906PhMIsYF!7%jM8WY+nAhx(D(=KpE`asJ<$bK?8v|9@fh|CjtX^Z$#2`SdV&d0~Fi z_A#DZtnk(!>Hn`ipRRX(QPtV`tDHM4F*jR6im&WKmT$xNm!1`f+5hKy-SLeLEs-)B zvDVMSZXweemim*%<@Sb#$!Xj&Z=EPeo*K;bE4|fL(q~p9c_yrWssDj}+Bx@!OghoJ zSFIiz%R6&Jbho3->{*7l(Kyo`;j( zKF7Nt`LMWfQfn9fG4>Q=ynh6}7@1i`9mnFzs6kj<1@#qyOePJCqPdZd_o;)!%oc!v zDmTAwd;d##!{t@4O*`~AOAnNX=w2Klc5)%7vLA;&|JkUfED&bn0w<*m4SPzjNdL7`1)Lb8Sh%dgHQkukJcWE9s+F zY`3-=_YhXSlA4oa$#H0va(jZfp}>*Ff}tIWO~;;G%3g!o@#ILr&Ik_9V#&9APOr;; zkn*spaPpOt=H%#5d;6wc-k2<0yo9LsuVVFjFGILUTq)if>d|K+YE>L^LeIQ!n=86! zn|gi;@lqq-@xa{wr@cG>hkEKLEimH#d&2vts6yt1hiDQd9a$=Q!Q-IK~02Og zJ?)I&!!a5QsNpJisc-c(B|jpxApieJh@$0E_9}i_RWMf&009sH0T2KI5C8!X009sH z0bUdMAMgL6|DP3;yZ;ZBXWQ`Fmxu9y00@8p2!H?xfB*=900@8p2=J4@xBGtsT%J>r zpiJ2>JKCm9Iw0WaC7pH4s-@mjrwLisgPTqH>-|4HM4)Tz{eQ*K{eS2uJ&a^1LdzsL zZq`kby02YE#$L5%j;q3-MK13nH6zmcNf`6=>^AXQHo?un`zgUQX+d8=xPO?y@&K9l zMuZtRJ5z7fGh1G7(;ce+f25!2S$vFeNK8p+9@5U#n#hS(@1XBmn&wjV`!nCr_iz~vK%Z5ky~1tHx&Bc z^o$z=K%mhklNkqSQNu6)d$9Vb6V;`XWQGzVmm3h!i=Cv&9EhSTJ)zEzS8rIkN8$a? z84?Q8`);+TNs!-Vc`7YODx)%Vbi9OwQ*8z za|Hnq009sH0T2KI5C8!X009u-HG$Fnf1$Oowv-slV9QOH!Vs};dA~fH5E0cUaVOE+ z+LYJy#p%Z^aiJzm%8*dMxJIc}l-gOp?1<09f$37md{>2H!j2Q3Evj`jTR`=Tx5<3g zc%Wv>1CGne2t!UQtz&f^+G)SLb@Uv3|iD1TX(W%<9wm691=I@NeV) z%GwE9T|3m)Y@caMWUhLI; zwX9&WAOHd&00JNY0w4eaAOHd&00KNFFoFI5IQReG?f*wth5mos{C|cY+m6RRJPZc} zKmY_l00ck)1V8`;KmY_lfUg85u>W7QaZLXIclZAY5!o`2SoH;q7MNPf7hIUCbusPi zi+CExPPRxZD^xjIZ`$<1JGj0!vpX3H6xVaK4xBhEEjU)oqy*9n75okxAx zeXj}~dPUvSasG0TZ-hIxqO5(SZbEfWcK8H6+yjHVk=}hI?dppBB zcAv;m)Fr9pS0MxSLm$r#p*=D!mO`460_h)K7f^_ z@BZ8VfAhZA|8GSUG!H2KCR%5I^UD>w5B9b$7 z0Kg<+@~d0}^-X>^6F{_7dTEwNKYi+w`J&nTLrltGVGwh-Rz~veg)<`z1s>mEI2>t8 zE3u8VzA{_@@Usj$cBla09mhL7^+C(X0l>Ovo&HzZAG8~Bv!ZO0a<=Wunz@dlg?gSs z%O=Zmuv3Q*0D49a0P@HT9Yk9%RuF;g!A?iqZT-3jAh$z6J8{}Z?|!7Bu*pxWFfOO* z0XjXkHtjmf^6|HYWH_AF_f7mX&GDAoy&6S6==k{G3IFwCjI%`U4qIHZN@lW`zMz4) zDSIQItt^->2!H?xfB*=900@8p2!H?xfB-KEjPCynt%bFv#8?JfEc$MUdPto!Tqz-H z9)i}4!jN>VUEQ^sawFT^>v}@`_Fk{YC|@qYwggo4?z?0l5|sDK+{RT9Pd9cCeN4DpJ8t(y(=|b zJb0UY|4y}Sc9rTE8;tWjML0EAs%E*Sa~}XW78Q1#xLVM8l&u!{*67sxP&->$5zfBf zES@FJnKC<~<6dP`l(JQbzml|ta?4{Xf^F8A-O^1KLNrP`BTsDcn$@F|saU&AN1o^GWoHB3sb zugdFO=a=glnK9|L>I?7twNHL0SfR{b!%LqX#sUH$00JNY0w4eaAOHd&00JPuX95$r z|5v0T;r{;z@BarP*&Fz5Wx;eo00ck)1V8`;KmY_l00ck)1b9hc?Ee2jUWsV8{KJB4 zg32pqrj%uq?3ww=R(&ElmnGMt4s1|rjJB+lko1jNe8eZH-?(IDdxD6g*vh0^?&;Tm zvzF|{q*+$xD5c%ZYrV36itwj-)1+3{p`G@-TSp(l?QmCc@iKO9P(!q4V*NH*i(24z z%|?Gr^>|sa@34hNZ0LmR38pU18L$LBN{`^j_b|F7PV8Ls~yuK|EKOCjk1hO}(P63NB>um7E$}MS1yh31oz{b6!_5aC3_5V+Z z{=<*{yRnys(*HVpzN-J%N1doHl_WE`j{$nIf%vNB2w&Dn{lDiryPKpvxbxil|DyBU z`v0Jj`hT7D#fDD|hwA^ad6eAUnAZoLUs{gT|DU<%_kvshe?1H8|M~3Cg6V<)2!H?x zfB*=900@8p2!H@@3H&wxKW|L_zeP*Er%n^HtOqxH;{E^VswH!+x%vOG-{${^f64zJ ziU0eY|8J6ID1aD<2~u+XyZnD{{NMjy|39)Pdo^!;cNh%_fB*=900@8p2!H?xfB*=9 z0DlRLbN??WJ%0ZGW2yqY|Np`F|AUj@{Xc*GSTI`<009sH0T2KI5C8!X009u-F@e$h z|F81@ZwcZe8;%{15K>+-J<(+5QiTOM7ZP7Om31%5!_RfzoRdFgvKE%WeAFG(_6i}W zn7TpQL2kA?CNXN(Vm>{V;#xGMZv zpgxW%*3XNgH|Zuqe!h zu3sO&aVzjpw@)LvRj;S3oyTs%SLq_`d$BCydVJM1#NFpaJZftqt&@XwMwPb{g-|L_ ziD(q}<$nO4aFiy;!E%%TziIzBbrr_xEd2ww{hztaQ2W1X;oc=Mt5e_}d5 z$Q?Vjc-mBzMC7KaVYZ7!C-400@8p2!H?xfB*=900{7zz&Q8+ vfA{{M*;)?o|9|lPf6;rkBcH7-m@Wu_00@8p2!H?xfB*=900@8p?+E+{E59u+ diff --git a/run/world/region/r.-21540.17735.mca b/run/world/region/r.-21540.17735.mca deleted file mode 100644 index 4e1de47010c8896f4e63e16cbaa3dfc7d69b84db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 315392 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 O0R#|0009K#6!>q4QBk}A diff --git a/run/world/region/r.-21540.17736.mca b/run/world/region/r.-21540.17736.mca deleted file mode 100644 index 0b2f16eef3779c728817b7ecc319a38536d552d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2772992 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 z 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 diff --git a/run/world/region/r.0.-1.mca b/run/world/region/r.0.-1.mca deleted file mode 100644 index 9a5ea3acef1cd95e0755736509e8dfb0a8584977..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 868352 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̹?QJ%olU!j4g{g+*-6I@U$5r> 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 z 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 W1V8`;KmY_l00ck)1VG@25cq%Q7P-U# diff --git a/run/world/region/r.0.0.mca b/run/world/region/r.0.0.mca deleted file mode 100644 index 5501eaa2ab6f97fb551c8d86ffc4a3033e893e78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 929792 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

{85UIO;Oo}A(Ws$k8Z5{&;|$Z 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 z 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 h@&AAEc7>%cS&WgzN3zhA#b`Xr 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 z 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/config/. -If the config being transferred is in a subfolder of the base config folder make sure to include that folder here in the path to the file you are overwriting. -For example if you are overwriting a config with the path /config/ExampleMod/config-server.toml, you would need to put it in serverconfig/ExampleMod/config-server.toml diff --git a/run/world/session.lock b/run/world/session.lock deleted file mode 100644 index 0d7e5f8..0000000 --- a/run/world/session.lock +++ /dev/null @@ -1 +0,0 @@ -☃ \ No newline at end of file From 1e58d7c855fec67caa16f75ad65f3caaa4431eba Mon Sep 17 00:00:00 2001 From: mathi Date: Thu, 6 Aug 2026 17:29:11 +0200 Subject: [PATCH 10/33] fix(reactor): stop the world save crashing on a heat of zero CNDataComponents.HEAT was registered with ExtraCodecs.POSITIVE_FLOAT, which rejects 0.0. The controller writes the heat on every tick, so a blueprint sitting in an idle or stopped reactor made the chunk save throw "Value must be positive: 0.0" while serializing the stack, and the block entity stopped persisting entirely. Zero is the normal heat of a reactor that is not running, so the codec was simply wrong. 1.21.1 has no ExtraCodecs.NON_NEGATIVE_FLOAT, so this uses plain Codec.FLOAT, matching the Forge branch which stores the value in an NBT double. The non-negative invariant stays enforced upstream in DefaultHeatCalculator#computeHeat, where violating it cannot take a save down: a persistent codec that can refuse a value fails at save time, far from the write that caused it. Introduced in lot 3 when heat storage moved from the blueprint's NBT tag to the typed data component. Adds heatComponent_atZero_survivesSerialization, which saves and re-parses a blueprint carrying heat=0 and would have caught this. The other four components use NON_NEGATIVE_INT and accept zero, so they carry no equivalent trap. Co-Authored-By: Claude Opus 5 (1M context) --- .../createnuclear/CNDataComponents.java | 14 ++++++- .../DefaultHeatCalculatorGameTest.java | 37 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/nuclearteam/createnuclear/CNDataComponents.java b/src/main/java/net/nuclearteam/createnuclear/CNDataComponents.java index aa4a936..3726a65 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNDataComponents.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNDataComponents.java @@ -23,9 +23,21 @@ public class CNDataComponents { private static final DeferredRegister.DataComponents DATA_COMPONENTS = DeferredRegister.createDataComponents(Registries.DATA_COMPONENT_TYPE, CreateNuclear.MOD_ID); + /** + * Reactor heat stored on the blueprint stack, written by the controller on every tick. + *

+ * Plain {@code Codec.FLOAT}, deliberately not {@code ExtraCodecs.POSITIVE_FLOAT}: zero is + * the normal value for an idle or stopped reactor, and a persistent codec that can reject + * a value crashes the world save rather than the write. That is exactly what happened with + * {@code POSITIVE_FLOAT} ("Value must be positive: 0.0" while serializing the blueprint). + *

+ * The non-negative invariant is enforced upstream instead, where it can't take a save down: + * {@code DefaultHeatCalculator#computeHeat} floors its result at 0. This also matches the + * Forge branch, which stores the value in a plain NBT double. + */ public static final DataComponentType HEAT = register( "heat", - builder -> builder.persistent(ExtraCodecs.POSITIVE_FLOAT).networkSynchronized(ByteBufCodecs.FLOAT) + builder -> builder.persistent(Codec.FLOAT).networkSynchronized(ByteBufCodecs.FLOAT) ); public static final DataComponentType REACTOR_BLUE_PRINT_DATA = register( diff --git a/src/main/java/net/nuclearteam/createnuclear/gametest/DefaultHeatCalculatorGameTest.java b/src/main/java/net/nuclearteam/createnuclear/gametest/DefaultHeatCalculatorGameTest.java index f95125c..2895287 100644 --- a/src/main/java/net/nuclearteam/createnuclear/gametest/DefaultHeatCalculatorGameTest.java +++ b/src/main/java/net/nuclearteam/createnuclear/gametest/DefaultHeatCalculatorGameTest.java @@ -2,7 +2,9 @@ import net.minecraft.core.BlockPos; import net.minecraft.gametest.framework.GameTest; +import net.minecraft.gametest.framework.GameTestAssertException; import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.nbt.Tag; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.gametest.GameTestHolder; @@ -78,6 +80,41 @@ private static void loadPattern(ReactorControllerInventory inventory, Map + * A persistent codec that can refuse a value fails at save time, not at write time, which is + * why this is asserted here rather than left to the non-negative floor in + * {@link DefaultHeatCalculator#computeHeat}. + */ + @GameTest(template = STRUCTURE) + public static void heatComponent_atZero_survivesSerialization(GameTestHelper helper) { + ItemStack blueprint = new ItemStack(CNItems.REACTOR_BLUEPRINT.get()); + blueprint.set(CNDataComponents.HEAT, 0f); + + var registries = helper.getLevel().registryAccess(); + Tag saved; + try { + saved = blueprint.save(registries); + } catch (RuntimeException e) { + throw new GameTestAssertException( + "a blueprint carrying heat=0 must be serializable, got: " + e.getMessage()); + } + + ItemStack restored = ItemStack.parse(registries, saved).orElse(ItemStack.EMPTY); + helper.assertTrue(restored.getOrDefault(CNDataComponents.HEAT, -1f) == 0f, + "heat=0 should round-trip through save/parse, got " + + restored.getOrDefault(CNDataComponents.HEAT, -1f)); + helper.succeed(); + } + // ================================================================ // 1. single fuel rod, no neighbors // ================================================================ From 12a7fc0a50fc91b53932b97c64e2bbc134f3a162 Mon Sep 17 00:00:00 2001 From: mathi Date: Thu, 6 Aug 2026 17:45:28 +0200 Subject: [PATCH 11/33] fix(reactor): dark frame fluid, two-slot rod input, unregistered nitrogen Three defects reported from in-game testing. Frame fluid rendered almost black. The renderer passed fluid.getFluid().defaultFluidState() to renderFluidBox, and the FluidState overload resolves texture and tint from the fluid's block state, losing the stack's tint. It now passes the FluidStack, as the Forge branch does. CatnipServices.FLUID_RENDERER is declared FluidRenderHelper, so the platform type has to be reintroduced with a cast - that wildcard is why the FluidStack overload appeared unavailable during the lot 6 port. Rod input exposed two slots, one hardcoded to uranium and one to graphite. Forge has a single slot accepting any fuel or cooler rod, resolved through RodType, so several rod inputs can be placed around the shell to feed different rods. The inventory drops to one slot, the menu draws one slot at Forge's coordinates, and quickMoveStack comes over as well. Liquid nitrogen was commented out of CNReactorFluidTypes, so no nitrogen.json was generated and the fluid had no registered ReactorFluidType. An unregistered fluid falls back to efficiency -1, which makes fluidMalus permanently true in DefaultOverheatController: overheat then climbs without bound and the reactor always melts down, whatever the rod pattern. Registered with Forge's values (maxHeat 8196, efficiency 100). Regenerated data: nitrogen.json, the 16 controller blockstate variants carrying the ACTIVE property with their off/standby/on models, and the eight reactor.debug lang keys. Co-Authored-By: Claude Opus 5 (1M context) --- .../35ba5b194a3aa18fb27424c32b9e16e01b900a51 | 11 ++-- .../fed443662143001aeb5341375f6f5ef31d10baea | 3 +- .../blockstates/reactor_controller.json | 62 ++++++++++++++----- .../assets/createnuclear/lang/en_ud.json | 8 +++ .../assets/createnuclear/lang/en_us.json | 8 +++ .../models/block/reactor/controller/off.json | 7 +++ .../models/block/reactor/controller/on.json | 7 +++ .../block/reactor/controller/standby.json | 7 +++ .../createnuclear/fluids/type/nitrogen.json | 5 ++ .../multiblock/fluid/CNReactorFluidTypes.java | 4 +- .../frame/ReactorFrameRenderer.java | 12 +++- .../input/item/ReactorRodInputInventory.java | 11 ++-- .../input/item/ReactorRodInputMenu.java | 49 +++++++++++---- 13 files changed, 152 insertions(+), 42 deletions(-) create mode 100644 src/generated/resources/assets/createnuclear/models/block/reactor/controller/off.json create mode 100644 src/generated/resources/assets/createnuclear/models/block/reactor/controller/on.json create mode 100644 src/generated/resources/assets/createnuclear/models/block/reactor/controller/standby.json create mode 100644 src/generated/resources/data/createnuclear/createnuclear/fluids/type/nitrogen.json diff --git a/src/generated/resources/.cache/35ba5b194a3aa18fb27424c32b9e16e01b900a51 b/src/generated/resources/.cache/35ba5b194a3aa18fb27424c32b9e16e01b900a51 index 1189b93..05327fd 100644 --- a/src/generated/resources/.cache/35ba5b194a3aa18fb27424c32b9e16e01b900a51 +++ b/src/generated/resources/.cache/35ba5b194a3aa18fb27424c32b9e16e01b900a51 @@ -1,4 +1,4 @@ -// 1.21.1 2026-08-05T14:44:16.6157795 Registrate Provider for createnuclear [Registries, Data Maps, Recipes, Advancements, Loot Tables, Tags (blocks), Tags (enchantments), Tags (items), Tags (fluids), Tags (entity_types), generic_server_provider, Blockstates, Item models, Lang (en_us/en_ud), generic_client_provider] +// 1.21.1 2026-08-06T17:15:59.2299409 Registrate Provider for createnuclear [Registries, Data Maps, Recipes, Advancements, Loot Tables, Tags (blocks), Tags (enchantments), Tags (items), Tags (fluids), Tags (entity_types), generic_server_provider, Blockstates, Item models, Lang (en_us/en_ud), generic_client_provider] 0b2c76c9cff305eacfdfb57c4b703f94ca6dc903 assets/createnuclear/blockstates/autunite.json 5d06bc544bcbeb7443178d66955bb5101cf696da assets/createnuclear/blockstates/autunite_pillar.json 5b375444ac5057e63776f4991589c57824574b4a assets/createnuclear/blockstates/cut_autunite.json @@ -30,7 +30,7 @@ f628f8c7aa1e150ad2b5a3ce87dbe7f00b462e74 assets/createnuclear/blockstates/polish 63aaf78c3e0c16c2f37b069c5392e3d1a93ac058 assets/createnuclear/blockstates/raw_uranium_block.json 1c9953bedf6cec725a6db7a199d826dcdfe9dfa7 assets/createnuclear/blockstates/reactor_alarm.json 0fbc9288622efc18fe39b6c8ba89e7e2281dee26 assets/createnuclear/blockstates/reactor_casing.json -60ca260d5b5bcd975c0a3918b461748786cde95e assets/createnuclear/blockstates/reactor_controller.json +0b5bd864f1e3b0c6b0ce868245da96fd8070fb21 assets/createnuclear/blockstates/reactor_controller.json 3c259041f317bb8868fb4f177c457fc12b8d28f5 assets/createnuclear/blockstates/reactor_cooler.json 3cced3f7d35371f1881b0485ee324788adcd2c74 assets/createnuclear/blockstates/reactor_core.json 0d8ab9ccc729b8e78539a2fab7b52b6be0afb24b assets/createnuclear/blockstates/reactor_fluid_input.json @@ -48,8 +48,8 @@ b9c915389ea6cf8338d20c48e908591f8baa2108 assets/createnuclear/blockstates/small_ 643a4d44b491a84d0d26e1a8944dffc40e83ce14 assets/createnuclear/blockstates/thorium_ore.json de2884054a21315d8b167f64b206be331d388420 assets/createnuclear/blockstates/uranium.json 4557f548df100ae1d05e3b5711797225f6a39673 assets/createnuclear/blockstates/uranium_ore.json -8766912dfc82a2fce135d86e472d1025202d6beb assets/createnuclear/lang/en_ud.json -ccf62d23006f103e0d73b981d83955391af0cdcf assets/createnuclear/lang/en_us.json +2431d3bca7a3bc956ff88294b698ab7f296f4e1c assets/createnuclear/lang/en_ud.json +ddd66ba88184c55978f42af204f7d367d428010b assets/createnuclear/lang/en_us.json a8495d2cd5e38213683becaf1c84b2852f8b06f5 assets/createnuclear/models/block/autunite_natural_0.json 29394a22ee8655dc22ea51563411505fbcfd2dab assets/createnuclear/models/block/autunite_natural_1.json 9e4f83de1ca7a9ab5363f43fc7c3f7f4ec6164d5 assets/createnuclear/models/block/autunite_natural_2.json @@ -97,6 +97,9 @@ b950ac6ca2df77ffe3abd02e13c38567602e5536 assets/createnuclear/models/block/polis cf8b4d604330762358b21b6e079aaab1eb2987f4 assets/createnuclear/models/block/raw_lead_block.json de9b4dee9580161263fa8020d326ac5fe4e38ed4 assets/createnuclear/models/block/raw_thorium_block.json 561c9f9a4e153fc648a3c7224812c71c8ac2da5c assets/createnuclear/models/block/raw_uranium_block.json +dedbaa09b31d53c446144816edf216d4c20253df assets/createnuclear/models/block/reactor/controller/off.json +988faa4b7af770a8256ea25247e333cbc9d14eca assets/createnuclear/models/block/reactor/controller/on.json +d58fcfe99b438b77b4a2dd8d0dd9e1f35d037bae assets/createnuclear/models/block/reactor/controller/standby.json d5acc57be1c8ccc3e61c40cf11856933d35803b3 assets/createnuclear/models/block/reactor_alarm.json e5cd1c3875c277d3770e723672bd290cb87406b3 assets/createnuclear/models/block/reinforced_glass.json e94d3eb865d17234b18241d89acdec2b10a1d21a assets/createnuclear/models/block/small_autunite_bricks.json diff --git a/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea b/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea index 2fe3402..54be547 100644 --- a/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea +++ b/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea @@ -1,5 +1,6 @@ -// 1.21.1 2026-08-05T14:36:36.8031552 CreateNuclear Generated Registry Entries +// 1.21.1 2026-08-06T17:43:42.187289 CreateNuclear Generated Registry Entries aa1897ff27a6aa83e2efbee29e12ad6dab2f6a0a data/createnuclear/createnuclear/fluids/type/fallback.json +d7c754aa51cea393a10bce85986c1c0c641150d5 data/createnuclear/createnuclear/fluids/type/nitrogen.json afee3d8f15bf8285e175f73befba7b46fdc94b19 data/createnuclear/createnuclear/fluids/type/water.json 706132bf26d87ed4a83f8d5f8793ab69a60b98fe data/createnuclear/createnuclear/rods/type/fallback.json 74de56c37a28ab632a6ffc161475bcec85de68e2 data/createnuclear/damage_type/fan_radiation.json diff --git a/src/generated/resources/assets/createnuclear/blockstates/reactor_controller.json b/src/generated/resources/assets/createnuclear/blockstates/reactor_controller.json index 28a903c..cbd0a7c 100644 --- a/src/generated/resources/assets/createnuclear/blockstates/reactor_controller.json +++ b/src/generated/resources/assets/createnuclear/blockstates/reactor_controller.json @@ -1,33 +1,63 @@ { "variants": { - "assembled=false,facing=east": { - "model": "createnuclear:block/reactor/controller/block", + "active=false,assembled=false,facing=east": { + "model": "createnuclear:block/reactor/controller/off", "y": 270 }, - "assembled=false,facing=north": { - "model": "createnuclear:block/reactor/controller/block", + "active=false,assembled=false,facing=north": { + "model": "createnuclear:block/reactor/controller/off", "y": 180 }, - "assembled=false,facing=south": { - "model": "createnuclear:block/reactor/controller/block" + "active=false,assembled=false,facing=south": { + "model": "createnuclear:block/reactor/controller/off" }, - "assembled=false,facing=west": { - "model": "createnuclear:block/reactor/controller/block", + "active=false,assembled=false,facing=west": { + "model": "createnuclear:block/reactor/controller/off", "y": 90 }, - "assembled=true,facing=east": { - "model": "createnuclear:block/reactor/controller/block", + "active=false,assembled=true,facing=east": { + "model": "createnuclear:block/reactor/controller/standby", "y": 270 }, - "assembled=true,facing=north": { - "model": "createnuclear:block/reactor/controller/block", + "active=false,assembled=true,facing=north": { + "model": "createnuclear:block/reactor/controller/standby", "y": 180 }, - "assembled=true,facing=south": { - "model": "createnuclear:block/reactor/controller/block" + "active=false,assembled=true,facing=south": { + "model": "createnuclear:block/reactor/controller/standby" }, - "assembled=true,facing=west": { - "model": "createnuclear:block/reactor/controller/block", + "active=false,assembled=true,facing=west": { + "model": "createnuclear:block/reactor/controller/standby", + "y": 90 + }, + "active=true,assembled=false,facing=east": { + "model": "createnuclear:block/reactor/controller/off", + "y": 270 + }, + "active=true,assembled=false,facing=north": { + "model": "createnuclear:block/reactor/controller/off", + "y": 180 + }, + "active=true,assembled=false,facing=south": { + "model": "createnuclear:block/reactor/controller/off" + }, + "active=true,assembled=false,facing=west": { + "model": "createnuclear:block/reactor/controller/off", + "y": 90 + }, + "active=true,assembled=true,facing=east": { + "model": "createnuclear:block/reactor/controller/on", + "y": 270 + }, + "active=true,assembled=true,facing=north": { + "model": "createnuclear:block/reactor/controller/on", + "y": 180 + }, + "active=true,assembled=true,facing=south": { + "model": "createnuclear:block/reactor/controller/on" + }, + "active=true,assembled=true,facing=west": { + "model": "createnuclear:block/reactor/controller/on", "y": 90 } } diff --git a/src/generated/resources/assets/createnuclear/lang/en_ud.json b/src/generated/resources/assets/createnuclear/lang/en_ud.json index b3db547..79249ef 100644 --- a/src/generated/resources/assets/createnuclear/lang/en_ud.json +++ b/src/generated/resources/assets/createnuclear/lang/en_ud.json @@ -250,6 +250,14 @@ "createnuclear.ponder.reactor_t3.text_7": "ʇı ʇɹɐʇs oʇ sǝob ʇuıɹdǝnןq ǝɥʇ ǝɹǝɥʍ ǝɔɐןd ǝɥʇ puɐ 'ɹoʇɔɐǝɹ ǝɥʇ ɟo uıɐɹq :ɹǝןןoɹʇuoƆ", "createnuclear.ponder.reactor_t3.text_8": "ㄥ ɹooןℲ", "createnuclear.ponder.reactor_t3.text_9": "8 ɹooןℲ", + "createnuclear.reactor.debug.label.alarm": "ɯɹɐןⱯ", + "createnuclear.reactor.debug.label.fluid_input": "ʇnduI pınןℲ", + "createnuclear.reactor.debug.label.input": "ʇnduI", + "createnuclear.reactor.debug.label.output": "ʇndʇnO", + "createnuclear.reactor.debug.registered_position": "%s @ pǝɹǝʇsıbǝɹ ", + "createnuclear.reactor.debug.summary": "pıןɐʌ %s 'pǝɹǝʇsıbǝɹ %s :%s", + "createnuclear.reactor.debug.title": "--- sɔıʇsoubɐıp ɹoʇɔɐǝᴚ ---", + "createnuclear.reactor.debug.valid_position": "%s @ pıןɐʌ ", "createnuclear.snow_powder.fan.recipe": "uɐɟ ɔıuǝboʎɹƆ", "createnuclear.subtitle.alarm/alarm": "dooꞀ ɯɹɐןⱯ ɹoʇɔɐǝᴚ", "createnuclear.subtitle.alarm/reactor_alarm": "ɯɹɐןⱯ ɹoʇɔɐǝᴚ", diff --git a/src/generated/resources/assets/createnuclear/lang/en_us.json b/src/generated/resources/assets/createnuclear/lang/en_us.json index ecdc89c..eb56abf 100644 --- a/src/generated/resources/assets/createnuclear/lang/en_us.json +++ b/src/generated/resources/assets/createnuclear/lang/en_us.json @@ -250,6 +250,14 @@ "createnuclear.ponder.reactor_t3.text_7": "Controller: brain of the reactor, and the place where the blueprint goes to start it", "createnuclear.ponder.reactor_t3.text_8": "Floor 7", "createnuclear.ponder.reactor_t3.text_9": "Floor 8", + "createnuclear.reactor.debug.label.alarm": "Alarm", + "createnuclear.reactor.debug.label.fluid_input": "Fluid Input", + "createnuclear.reactor.debug.label.input": "Input", + "createnuclear.reactor.debug.label.output": "Output", + "createnuclear.reactor.debug.registered_position": " registered @ %s", + "createnuclear.reactor.debug.summary": "%s: %s registered, %s valid", + "createnuclear.reactor.debug.title": "--- Reactor diagnostics ---", + "createnuclear.reactor.debug.valid_position": " valid @ %s", "createnuclear.snow_powder.fan.recipe": "Cryogenic fan", "createnuclear.subtitle.alarm/alarm": "Reactor Alarm Loop", "createnuclear.subtitle.alarm/reactor_alarm": "Reactor Alarm", diff --git a/src/generated/resources/assets/createnuclear/models/block/reactor/controller/off.json b/src/generated/resources/assets/createnuclear/models/block/reactor/controller/off.json new file mode 100644 index 0000000..fb38b94 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/block/reactor/controller/off.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:block/reactor/controller/block", + "textures": { + "1": "createnuclear:block/reactor/controller/controller_panel_off", + "particle": "createnuclear:block/reactor/controller/controller_panel_off" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/block/reactor/controller/on.json b/src/generated/resources/assets/createnuclear/models/block/reactor/controller/on.json new file mode 100644 index 0000000..423b3f4 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/block/reactor/controller/on.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:block/reactor/controller/block", + "textures": { + "1": "createnuclear:block/reactor/controller/controller_panel_on", + "particle": "createnuclear:block/reactor/controller/controller_panel_on" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/block/reactor/controller/standby.json b/src/generated/resources/assets/createnuclear/models/block/reactor/controller/standby.json new file mode 100644 index 0000000..59dc81d --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/block/reactor/controller/standby.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:block/reactor/controller/block", + "textures": { + "1": "createnuclear:block/reactor/controller/controller_panel_standby", + "particle": "createnuclear:block/reactor/controller/controller_panel_standby" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/createnuclear/fluids/type/nitrogen.json b/src/generated/resources/data/createnuclear/createnuclear/fluids/type/nitrogen.json new file mode 100644 index 0000000..8056bad --- /dev/null +++ b/src/generated/resources/data/createnuclear/createnuclear/fluids/type/nitrogen.json @@ -0,0 +1,5 @@ +{ + "efficiency": 100, + "fluids": "createnuclear:nitrogen", + "maxHeat": 8196 +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/fluid/CNReactorFluidTypes.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/fluid/CNReactorFluidTypes.java index b75a8ed..d2ced40 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/fluid/CNReactorFluidTypes.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/fluid/CNReactorFluidTypes.java @@ -42,12 +42,12 @@ public static void bootstrap(BootstrapContext ctx) { .efficiency(1000) .build() ); - /* register(ctx, "nitrogen", new ReactorFluidType.Builder() + register(ctx, "nitrogen", new ReactorFluidType.Builder() .fluid(CNFluids.LIQUID_NITROGEN.getSource()) .maxHeat(8196) .efficiency(100) .build() - );*/ + ); } private static void register(BootstrapContext ctx, String name, ReactorFluidType type) { diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrameRenderer.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrameRenderer.java index 22cf929..ce46c08 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrameRenderer.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrameRenderer.java @@ -3,6 +3,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; import net.createmod.catnip.platform.CatnipServices; +import net.createmod.catnip.render.FluidRenderHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.neoforged.neoforge.fluids.FluidStack; @@ -67,8 +68,15 @@ protected void renderSafe(ReactorFrameEntity be, float partialTicks, PoseStack m // Last arg (invertGasses) must be false: liquid nitrogen has density 0, so // it counts as "lighter than air" and would otherwise be flipped 180°, // hiding the top surface. We always fill bottom-to-top here. - CatnipServices.FLUID_RENDERER.renderFluidBox( - fluid.getFluid().defaultFluidState(), // 1.21 takes a FluidState, not a FluidStack + // Must pass the FluidStack, not fluid.getFluid().defaultFluidState(): the FluidState + // overload resolves the texture and tint from the fluid's block state, which loses the + // stack's tint and renders water almost black in the frame windows. + // CatnipServices.FLUID_RENDERER is declared as FluidRenderHelper, so the platform + // type has to be reintroduced by hand — on NeoForge it is neoforge's FluidStack. + @SuppressWarnings("unchecked") + FluidRenderHelper fluidRenderer = (FluidRenderHelper) CatnipServices.FLUID_RENDERER; + + fluidRenderer.renderFluidBox(fluid, X_MIN, boxYMin, Z_MIN, X_MAX, yMax, Z_MAX, buffer, ms, light, false, false); } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputInventory.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputInventory.java index 351dfa8..117abfb 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputInventory.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputInventory.java @@ -2,15 +2,16 @@ import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import net.neoforged.neoforge.items.ItemStackHandler; -import net.nuclearteam.createnuclear.CNItems; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRodPredicate; import org.jetbrains.annotations.NotNull; public class ReactorRodInputInventory extends ItemStackHandler { private final ReactorRodInputEntity be; public ReactorRodInputInventory(ReactorRodInputEntity be) { - super(2); + super(1); this.be = be; } @@ -22,10 +23,10 @@ protected void onContentsChanged(int slot) { @Override public boolean isItemValid(int slot, @NotNull ItemStack stack) { + Level level = be.getLevel(); return switch (slot) { - case 0 -> CNItems.URANIUM_ROD.isIn(stack); - case 1 -> CNItems.GRAPHITE_ROD.isIn(stack); + case 0 -> level != null && (TypeRodPredicate.isFuel(stack, level) || TypeRodPredicate.isCooled(stack, level)); default -> !super.isItemValid(slot, stack); }; } -} \ No newline at end of file +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputMenu.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputMenu.java index bcca196..b40d581 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputMenu.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputMenu.java @@ -30,13 +30,42 @@ public static ReactorRodInputMenu create(int id, Inventory inv, ReactorRodInputE } @Override - public ItemStack quickMoveStack(Player player, int index) { - Slot clickedSlot = getSlot(index); - if (!clickedSlot.hasItem()) return ItemStack.EMPTY; - ItemStack stack = clickedSlot.getItem(); - if (index < 2) moveItemStackTo(stack, 2, slots.size(), false); - else moveItemStackTo(stack, 0, 2, false); - return ItemStack.EMPTY; + public ItemStack quickMoveStack(Player playerIn, int index) { + ItemStack result = ItemStack.EMPTY; + Slot slot = this.slots.get(index); + if (slot != null && slot.hasItem()) { + ItemStack stackInSlot = slot.getItem(); + result = stackInSlot.copy(); + + int playerInventorySize = player.getInventory().items.size(); // normally 36 + int containerStart = playerInventorySize; + int containerEnd = containerStart + 1; // 1 machine slot + + // Clicked a machine slot (after the player slots) + if (index >= containerStart && index < containerEnd) { + if (!this.moveItemStackTo(stackInSlot, 0, playerInventorySize, true)) { + return ItemStack.EMPTY; + } + } else { + // Clicked a player slot — try moving the stack into the machine container + if (!this.moveItemStackTo(stackInSlot, containerStart, containerEnd, false)) { + return ItemStack.EMPTY; + } + } + + if (stackInSlot.isEmpty()) { + slot.set(ItemStack.EMPTY); + } else { + slot.setChanged(); + } + + if (stackInSlot.getCount() == result.getCount()) { + return ItemStack.EMPTY; + } + + slot.onTake(playerIn, stackInSlot); + } + return result; } @@ -71,13 +100,9 @@ protected void addSlots() { } } - Slot slot1 = new SlotItemHandler(contentHolder.inventory, 0, 24, 29); - Slot slot2 = new SlotItemHandler(contentHolder.inventory, 1, 57, 29); + Slot slot1 = new SlotItemHandler(contentHolder.inventory, 0, 42, 29); addSlot(slot1); - addSlot(slot2); - - } @Override From 1eacc3ceed71c23078a44e0e543e56b31dcb25bf Mon Sep 17 00:00:00 2001 From: mathi Date: Thu, 6 Aug 2026 18:06:06 +0200 Subject: [PATCH 12/33] fix(reactor): restore the output stress capacity and the missing render layers Two defects reported from in-game testing. The reactor output produced 81920 SU where Forge produces 512000. Its stress capacity was registered at 10240.0 instead of Forge's 64000.0 - the 6.25x ratio matches the observed numbers exactly. Restored. The fluid in the frame windows rendered almost black. The frame block was missing noOcclusion(), so it counted as a full opaque block: light stopped propagating through it and the fluid rendered inside the window came out at near-zero light. Passing the FluidStack instead of a FluidState (previous commit) was necessary but not sufficient - this is the other half. While checking that, four more blocks turned out to have lost their render layer relative to Forge, which has five addLayer calls to NeoForge's one: - reactor_frame and reactor_rod_input and reactor_fluid_input: cutoutMipped - reinforced_glass: translucent, without which it renders opaque - enriching_fire: cutout addLayer is deprecated for removal in this registrate version, but it is what Forge uses and PalettesVariantEntry already relies on it here, so switching away from it is left as its own change rather than mixed into a fix. Co-Authored-By: Claude Opus 5 (1M context) --- .../net/nuclearteam/createnuclear/CNBlocks.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/nuclearteam/createnuclear/CNBlocks.java b/src/main/java/net/nuclearteam/createnuclear/CNBlocks.java index 5fa103a..bd34173 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNBlocks.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNBlocks.java @@ -9,6 +9,7 @@ import com.tterrag.registrate.providers.RegistrateRecipeProvider; import com.tterrag.registrate.providers.loot.RegistrateBlockLootTables; import com.tterrag.registrate.util.entry.BlockEntry; +import net.minecraft.client.renderer.RenderType; import net.minecraft.core.Direction; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; @@ -102,7 +103,11 @@ public class CNBlocks { public static final BlockEntry REACTOR_FRAME = CreateNuclear.REGISTRATE.block("reactor_frame", ReactorFrame::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.explosionResistance(3F).destroyTime(2F)) + // noOcclusion is what makes the window actually readable: without it the frame counts + // as a full opaque block, light stops propagating through it, and the fluid rendered + // inside the window comes out almost black. + .properties(p -> p.explosionResistance(3F).destroyTime(2F).noOcclusion()) + .addLayer(() -> RenderType::cutoutMipped) .transform(pickaxeOnly()) .tag(BlockTags.NEEDS_DIAMOND_TOOL) .blockstate((c, p) -> @@ -148,6 +153,7 @@ public class CNBlocks { .initialProperties(SharedProperties::stone) .properties(p -> p.explosionResistance(6F)) .properties(p -> p.destroyTime(2F)) + .addLayer(() -> RenderType::cutoutMipped) .transform(pickaxeOnly()) .tag(BlockTags.NEEDS_DIAMOND_TOOL) .blockstate(new ReactorRodInputGenerator()::generate) @@ -160,6 +166,7 @@ public class CNBlocks { .initialProperties(SharedProperties::stone) .properties(p -> p.explosionResistance(6F)) .properties(p -> p.destroyTime(2F)) + .addLayer(() -> RenderType::cutoutMipped) .transform(pickaxeOnly()) .tag(BlockTags.NEEDS_DIAMOND_TOOL) .blockstate(new ReactorFluidInputGenerator()::generate) @@ -175,7 +182,7 @@ public class CNBlocks { .tag(AllTags.AllBlockTags.SAFE_NBT.tag, BlockTags.NEEDS_DIAMOND_TOOL) .transform(pickaxeOnly()) .blockstate(new ReactorOutputGenerator()::generate) - .onRegister(block -> BlockStressValues.CAPACITIES.register(block, () -> 10240.0)) + .onRegister(block -> BlockStressValues.CAPACITIES.register(block, () -> 64000.0)) .item() .transform(customItemModel("reactor", "output", "item")) .register(); @@ -204,6 +211,7 @@ public class CNBlocks { .block("reinforced_glass", ReinforcedGlassBlock::new) .initialProperties(() -> Blocks.GLASS) .properties(p -> p.explosionResistance(7.0F).destroyTime(2F)) + .addLayer(() -> RenderType::translucent) .onRegister(CreateRegistrate.connectedTextures(() -> new EncasedCTBehaviour(CNSpriteShifts.REACTOR_GLASS))) .onRegister(casingConnectivity((block,cc) -> cc.makeCasing(block, CNSpriteShifts.REACTOR_GLASS))) .loot(RegistrateBlockLootTables::dropWhenSilkTouch) @@ -242,6 +250,7 @@ public class CNBlocks { .properties(EnrichingFireBlock.getLight()) .tag(CNBlockTags.FAN_PROCESSING_CATALYSTS_ENRICHED.tag) .loot((lt, b) -> lt.add(b, BlockLootSubProvider.noDrop())) + .addLayer(() -> RenderType::cutout) .blockstate((c, p) -> { String baseFolder = "block/enriching/fire/"; ModelFile Floor0 = p.models().getExistingFile(p.modLoc(baseFolder + "floor0")); From a8f23b830fb22f873c1f9211f95bb13c4ee1dd2b Mon Sep 17 00:00:00 2001 From: mathi Date: Thu, 6 Aug 2026 18:22:27 +0200 Subject: [PATCH 13/33] docs: close out the reactor port and inventory what is left Marks the port complete: eight lots done, validated in game, 31 gametests with the two intentional failures. Adds lot 9, the six defects found while playing, with which of them the port introduced (one) and which were pre-existing NeoForge divergences (five). Adds section 9, a full inventory of what is still not ported. The raw count is 42 Forge files with no NeoForge counterpart, but six of those exist under another name - two of them only differ by a typo - so the real remainder is 36, listed by feature rather than by file. Also lists the shared files that diverge heavily but were never audited, with the caveat that a large diff is not evidence of a missing feature: most of it is 1.21 API. Lot 9 showed those diffs do hide real bugs though - the stress capacity and the missing render layers were both inside CNBlocks. Records the extractFluids over-extraction bug as present in BOTH versions, so it gets fixed in both, and warns against gating CI on runGameTestServer until then. Co-Authored-By: Claude Opus 5 (1M context) --- PORTAGE_REACTEUR.md | 177 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 175 insertions(+), 2 deletions(-) diff --git a/PORTAGE_REACTEUR.md b/PORTAGE_REACTEUR.md index e57d413..497762a 100644 --- a/PORTAGE_REACTEUR.md +++ b/PORTAGE_REACTEUR.md @@ -1,8 +1,22 @@ # Portage du réacteur — Forge → NeoForge -Comparaison `CreateNuclearForge` (branche `V2`) → `CreateNuclearNeoForge` (branche `V2`). +Comparaison `CreateNuclearForge` (branche `V2`) → `CreateNuclearNeoForge` (branche `V2-Reacteur`). Périmètre : domaine réacteur uniquement (`content/multiblock/**` + dépendances directes). +> ## ✅ Portage terminé et validé en jeu +> +> Les 8 lots sont faits. Le réacteur s'assemble, produit, chauffe, alarme, fond et explose. +> Validé en jeu par mathi le 6 août 2026 : assemblage, blueprint, fluide, production SU. +> +> **~50 fichiers portés**, dont la majorité identiques à l'octet à l'original Forge. +> `ReactorControllerBlockEntity` : 868 lignes monolithiques → 424 lignes déléguantes, +> divergence vs Forge ramenée de **864 lignes à 76** (toutes des adaptations 1.21). +> +> Gametests : `./gradlew runGameTestServer` → **31 tests, 29 passent**, 2 échecs volontaires +> (marqueurs de régression `*_expectedContract`, qui échouent aussi sur Forge). +> +> Ce qui reste hors périmètre est inventorié en **§9**. + --- ## 1. Constat central @@ -224,6 +238,29 @@ Fichiers portés avec : `ReactorControllerBlock` · `ReactorAssembler` · `CNMul (Forge : `REACTOR_ROD_INPUT`) — les renommer changerait l'identifiant de registre `createnuclear:reactor_input` et casserait les mondes existants. +### Lot 9 — Corrections issues du test en jeu ✅ FAIT + +Six défauts trouvés en jouant, tous corrigés. Cinq étaient des divergences NeoForge +préexistantes, un était une erreur introduite par le portage. + +| Symptôme en jeu | Cause | Origine | +|---|---|---| +| Crash à la sauvegarde du monde | `CNDataComponents.HEAT` en `ExtraCodecs.POSITIVE_FLOAT`, qui refuse `0.0` — or un réacteur à l'arrêt écrit 0 à chaque tick | **introduit au lot 3** | +| Fluide quasi noir dans les vitres | `reactor_frame` sans `.noOcclusion()` : bloc traité comme opaque plein, la lumière ne passe plus | préexistant | +| idem | renderer passant un `FluidState` au lieu du `FluidStack`, ce qui perd la teinte | introduit au lot 6 | +| 2 slots dans le rod input | `super(2)` avec uranium/graphite figés, au lieu d'un slot acceptant toute barre via `RodType` | préexistant | +| Explosion malgré un pattern stable | azote liquide **commenté** dans `CNReactorFluidTypes` → pas de `ReactorFluidType` → `efficiency = -1` → `fluidMalus` permanent → surchauffe infinie | préexistant | +| 81 920 SU au lieu de 512 000 | capacité de stress du `REACTOR_OUTPUT` à `10240.0` au lieu de `64000.0` (rapport 6,25 ✓) | préexistant | + +> **Leçon sur les codecs :** un codec **persistant** qui peut refuser une valeur échoue au moment +> de la **sauvegarde**, très loin de l'écriture fautive, et emporte le block entity avec lui. +> Les invariants de domaine se valident en amont, pas dans le codec. +> Le test `heatComponent_atZero_survivesSerialization` verrouille ce cas. + +**Trouvé en vérifiant :** Forge a **5 appels à `addLayer`**, NeoForge n'en avait qu'**un**. +Quatre blocs avaient perdu leur couche de rendu — dont `reinforced_glass` en `translucent`, +qui rendait donc **opaque**. Tous rétablis. + --- ## 5. Pièges de traduction 1.20.1 Forge → 1.21 NeoForge @@ -339,4 +376,140 @@ bloquante avant d'avoir corrigé `extractFluids` (dans les deux repos). ## 8. Hors périmètre de ce rapport -Le reste du mod présente aussi des écarts (~40 fichiers) : sources DisplayLink, animaux irradiés, datagen de recettes, worldgen, mixins client, compat JEI/Alex's Caves. À traiter dans un second temps. \ No newline at end of file +Le reste du mod présente aussi des écarts. Inventaire complet en §9. + +--- + +## 9. Ce qui n'est PAS porté de Forge vers NeoForge + +État au 6 août 2026, branche `V2-Reacteur`. Le comptage brut donne **42 fichiers Forge sans +équivalent NeoForge**, mais 6 sont en réalité présents sous un autre nom — le vrai reste est +**36 fichiers**, plus des écarts internes sur des fichiers partagés. + +### 9.1 Faux positifs — présents mais renommés ou déplacés + +Ne pas les reporter comme manquants lors d'une synchro : + +| Forge | NeoForge | +|---|---| +| `content/multiblock/rod/CNRodTypes` | `content/rod/CNRodTypes` | +| `foundation/damageTypes/CNDamageSources` | `foundation/damages**T**ypes/CNDamageSources` | +| `content/equipment/armor/ArmorMaterials` | `CNArmorMaterials` | +| `infrastructure/config/CExplode` | `CExplose` *(faute de frappe côté Neo)* | +| `input/fluid/PlayerInteract**R**eactorFluidInput` | `PlayerInteract**e**ReactorFluidInput` *(faute de frappe)* | +| `irradiated/cat/CatLieOnBedGoal`, `CatSitOnBlockGoal` | `IrradiatedCatLieOnBedGoal`, `IrradiatedCatSitOnBlockGoal` | + +### 9.2 Features entièrement absentes + +**① Jauges DisplayLink du réacteur — 9 fichiers** ← *le manque le plus visible en jeu* + +`CNDisplaySources` · `AbstractReactorStatDisplaySource` · `HeatDisplaySource` · +`FuelDisplaySource` · `CoolerDisplaySource` · `LiquidLevelDisplaySource` · +`ReactorSizeDisplaySource` · `ReactorDisplayConstants` · `ReactorGaugeRenderer` + +NeoForge n'a que `ReactorSummary` + `ReactorSummaryDisplaySource`. Côté Forge, `CNBlocks` +attache en plus au contrôleur `.transform(displaySource(CNDisplaySources.HEAT))`, +`LIQUID_LEVEL`, etc. — **impossible de brancher un Display Link sur une statistique précise +du réacteur** côté NeoForge. Le code réacteur nécessaire (`ReactorDisplayState`, +`getMultiblockSize`, `getInputFluidManager`) est désormais en place, donc c'est un portage +direct sans prérequis. +*NeoForge a en plus `ReactorGaugeOverrides`, qui n'existe pas côté Forge.* + +**② Poudre de neige (Snow Powder) — 4 fichiers** + +`SnowPowderRecipe` · `SnowPowderRecipeGen` · `CNSnowPowderRecipeGen` · `FanSnowPowderCategory` (JEI) + +Recette de ventilateur complète, avec sa catégorie JEI. Rien de tout ça côté NeoForge. + +**③ Vache irradiée + abstraction des animaux — 5 fichiers** + +`IrradiatedCow` · `IrradiatedCowModel` · `IrradiatedCowRenderer` · `IrradiatedAnimal` · `AnimalUtil` + +NeoForge a le chat, le loup et le poulet, mais **pas la vache**. Il lui manque aussi la classe +de base `IrradiatedAnimal` et l'utilitaire `AnimalUtil` : ses animaux dupliquent donc la +logique que Forge a factorisée. C'est le dossier le plus divergent hors réacteur +(`IrradiatedCat` 384 lignes d'écart, `IrradiatedWolf` 333). + +**④ Worldgen piloté par config — 2 fichiers** + +`CNPlacementModifiers` · `ConfigPlacementFilter` + +Filtre de placement lisant la config : sans lui, les options de génération de minerai +(`CWorldGen`) ne sont probablement pas respectées. + +**⑤ Datagen de recettes — 2 fichiers** + +`CNDeployingRecipeGen` · `CNProcessingRecipeGen` — des recettes existent donc côté Forge +et pas côté NeoForge. + +**⑥ Radiation — 2 fichiers** + +`IRadiationCapability` · `RadiationProvider` + +Attendu : NeoForge 1.21 remplace les capabilities Forge par les *data attachments*. +`RadiationCapability` existe et diverge de 186 lignes. **À vérifier fonctionnellement** +plutôt qu'à porter à l'identique. + +**⑦ Compat externe — 2 fichiers** + +`Mods` · `AlexscaveCompat` — intégration Alex's Caves absente. + +**⑧ Mixins client — 2 fichiers** + +`CameraAccessor` · `GameRendererMixin` — effet visuel (probablement lié au shader de radiation). +NeoForge a à la place `AntiRadiationArmorTextureMixin`, qui n'existe pas côté Forge. + +**⑨ Divers — 6 fichiers** + +`CNOpenPipeEffectHandlers` (effets des tuyaux ouverts) · `UraniumOreItem` · +`CriterionTriggerBase` (base des advancements custom) · `RodsTooltipHandler` + +`RodsStats` (tooltips détaillés des barres) · `SimplexNoise` + +**⑩ Extracteur d'irradiation de biome — 1 fichier** + +`BiomeIrradationExtractorItem`. ⚠️ **Déjà porté en amont** : les 4 commits d'`origin/V2` que +cette branche n'a pas encore intégrés l'ajoutent sous le nom `BiomeIrradiationExtractorItem`. +Il apparaîtra automatiquement au merge. + +### 9.3 Portés mais non audités + +Ces fichiers existent des deux côtés mais divergent fortement. Un gros diff n'est **pas** +une preuve de feature manquante — l'API 1.21 en explique une grande part. Aucun n'a été +audité ligne à ligne, contrairement au domaine réacteur. + +| Fichier | Lignes divergentes | +|---|---| +| `CNBlocks` | 701 | +| `CNItems` | 457 | +| `foundation/data/recipe/CNStandardRecipeGen` | 395 | +| `foundation/advancement/CNAdvancement` | 394 | +| `content/contraptions/irradiated/cat/IrradiatedCat` | 384 | +| `compat/jei/CreateNuclearJEI` | 344 | +| `content/contraptions/irradiated/wolf/IrradiatedWolf` | 333 | +| `CNCreativeModeTabs` | 249 | +| `content/radiation/capability/RadiationCapability` | 186 | + +Le lot 9 a montré que ces écarts cachent de vrais bugs : la capacité de stress et les +`addLayer` manquants étaient tous les deux dans `CNBlocks`. + +### 9.4 Bugs connus, présents dans les DEUX versions + +À corriger dans les deux repos, pas seulement ici : + +`ReactorInputFluidManager.extractFluids` ne décrémente jamais `fluidNeeded` entre les +handlers (**sur-extraction** : demander 10 unités en retire 10 par entrée) et ignore les +demandes d'exactement 1 unité (`if (toExtract > 1)`). Les deux gametests +`*_expectedContract` échouent volontairement là-dessus et deviendront verts une fois corrigé. +C'est aussi pour ça que `runGameTestServer` sort en code 1 : **ne pas le brancher en CI +bloquante** avant. + +### 9.5 Ordre suggéré pour la suite + +1. **Merger `origin/V2`** (4 commits d'avance) — un seul conflit attendu, un import dans `CNItems`. +2. **Jauges DisplayLink** — le plus visible, sans prérequis, le réacteur expose déjà tout. +3. **Corriger `extractFluids`** dans les deux repos, les tests passent au vert. +4. **Worldgen config** — silencieux mais fausse la génération de minerai. +5. **Vache irradiée + `IrradiatedAnimal`/`AnimalUtil`** — permet aussi de dédupliquer chat/loup/poulet. +6. Snow Powder, datagen manquant, compat Alex's Caves, mixins client. +7. **Auditer `CNBlocks` et `CNItems`** en dernier, mais ne pas l'oublier : c'est là qu'étaient + cachés deux des six bugs du lot 9. \ No newline at end of file From 90f02adf188783f9dd0fe24e34c51b1b6550d1e3 Mon Sep 17 00:00:00 2001 From: mathi Date: Thu, 6 Aug 2026 18:45:06 +0200 Subject: [PATCH 14/33] chore: restore potion.png, deleted by accident in the merge It was tracked at the repo root but missing from the working tree, so the merge commit recorded a deletion nobody asked for. Co-Authored-By: Claude Opus 5 (1M context) --- potion.png | Bin 0 -> 54295 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 potion.png diff --git a/potion.png b/potion.png new file mode 100644 index 0000000000000000000000000000000000000000..624428cbb922fa48425e192266cd5bda96091cec GIT binary patch literal 54295 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 Date: Thu, 6 Aug 2026 18:52:29 +0200 Subject: [PATCH 15/33] fix(reactor): stop extractFluids over-draining across fluid inputs extractFluids never decremented fluidNeeded between handlers, so the requested amount was treated as a per-input quota instead of a total: a reactor asking for 10 units with two fluid inputs holding 10 each drained both, removing 20. The more inputs the player placed, the faster the coolant vanished. An `if (toExtract > 1)` guard also silently dropped requests for exactly one unit, which is what FluidConsumptionRateCalculator asks for at the low end of the consumption curve, so the smallest reactors leaked their buffer accounting. The loop now tracks what is left to extract, stops once satisfied, and subtracts what the handler actually returned rather than what was asked of it. The Javadoc claimed "true if the full amount was extracted" while the code returned true on any partial extraction. The code's behaviour is the right one - the reactor should consume whatever coolant it can reach rather than refuse to run - so the Javadoc now documents that instead. The two gametests that pinned the buggy behaviour are removed, and extractFluids_returnsTrueEvenWhenNotFullyExtracted_javadocMismatch is renamed now that there is no mismatch. The suite goes from 31 tests with 2 intentional failures to 29 all passing, so runGameTestServer exits 0 and can gate CI. The same fix is applied to the Forge branch, which carries the identical bug. Co-Authored-By: Claude Opus 5 (1M context) --- .../manager/ReactorInputFluidManager.java | 35 ++++++--- .../ReactorInputFluidManagerGameTest.java | 75 ++++--------------- 2 files changed, 39 insertions(+), 71 deletions(-) diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputFluidManager.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputFluidManager.java index ac746c7..5e37e97 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputFluidManager.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputFluidManager.java @@ -131,28 +131,39 @@ public VirtualReactorInputFluid getInventory(Level level) { return virtualReactorInputFluid; } - @Override /** - * Attempt to extract up to {@code fluidNeeded} units of fluid from tracked handlers. - * Returns true if the full amount was extracted. + * Extracts up to {@code fluidNeeded} units of fluid, spread across the tracked handlers. + *

+ * The requested amount is a TOTAL across every input, not a per-input quota: each handler + * only ever drains what is still missing, so a request of 10 units against two inputs + * holding 10 each removes 10 in total, not 20. + * + * @return {@code true} if at least one unit was actually drained. A partial extraction still + * returns {@code true}: the reactor consumes whatever coolant it can reach rather + * than refusing to run. */ + @Override public boolean extractFluids(Level level, int fluidNeeded) { - if (level == null) return false; - boolean isExtracted = false; + if (level == null || fluidNeeded <= 0) return false; List handlers = getFuildHandlers(level); if (handlers.isEmpty()) return false; + int remaining = fluidNeeded; + for (IFluidHandler handler : handlers) { + if (remaining <= 0) break; + FluidStack stack = handler.getFluidInTank(0); if (stack.isEmpty()) continue; - int toExtract = Math.min(fluidNeeded, stack.getAmount()); - if (toExtract > 1) { - handler.drain(toExtract, FluidAction.EXECUTE); - isExtracted = true; - } - if (fluidNeeded <= 0) break; + + int toExtract = Math.min(remaining, stack.getAmount()); + if (toExtract <= 0) continue; + + // Subtract what was actually drained, not what was asked for: a handler is free to + // hand back less than requested. + remaining -= handler.drain(toExtract, FluidAction.EXECUTE).getAmount(); } - return isExtracted; + return remaining < fluidNeeded; } } diff --git a/src/main/java/net/nuclearteam/createnuclear/gametest/ReactorInputFluidManagerGameTest.java b/src/main/java/net/nuclearteam/createnuclear/gametest/ReactorInputFluidManagerGameTest.java index 516b163..2ae58d0 100644 --- a/src/main/java/net/nuclearteam/createnuclear/gametest/ReactorInputFluidManagerGameTest.java +++ b/src/main/java/net/nuclearteam/createnuclear/gametest/ReactorInputFluidManagerGameTest.java @@ -40,13 +40,11 @@ * instead of Forge's {@code be.getCapability(ForgeCapabilities.FLUID_HANDLER)}, and fluid ids are * resolved via {@code BuiltInRegistries.FLUID} instead of {@code ForgeRegistries.FLUIDS}. *

- * Tests named "*_expectedContract" assert the documented/intended behavior of - * extractFluids and are EXPECTED TO FAIL against the current implementation - * (fluidNeeded is never decremented between handlers, and a request for exactly - * one unit is silently dropped). They act as regression markers for the future fix, - * and fail identically on the Forge branch. Tests named - * "*_currentBehavior"/"*_characterization" assert what the code does today and should - * keep passing until that fix lands. + * Tests named "*_expectedContract" cover the two extractFluids defects fixed on both branches: + * fluidNeeded was never decremented between handlers (so a request of 10 units drained 10 from + * EVERY input), and a request for exactly one unit was silently dropped by an + * {@code if (toExtract > 1)} guard. The whole suite passes; the two characterization tests that + * pinned the buggy behaviour were removed with the fix. */ @GameTestHolder(CreateNuclear.MOD_ID) @PrefixGameTestTemplate(false) @@ -365,26 +363,8 @@ public static void extractFluids_singleHandlerInsufficientStock_drainsAvailable( } /** - * Characterizes the CURRENT (buggy) behavior: "if (toExtract > 1)" silently ignores - * a request for exactly 1 unit. This test PASSES today. - */ - @GameTest(template = STRUCTURE) - public static void extractFluids_needOfOne_isSilentlyIgnored_currentBehavior(GameTestHelper helper) { - BlockPos rel = new BlockPos(1, 1, 1); - place(helper, rel, Direction.NORTH); - fill(helper, rel, new FluidStack(Fluids.WATER, 5)); - - boolean result = manager(helper, rel).extractFluids(helper.getLevel(), 1); - - helper.assertTrue(!result, "current implementation ignores single-unit extraction requests"); - helper.assertTrue(tankAmount(helper, rel) == 5, "tank should be untouched: the toExtract>1 guard blocks the drain"); - helper.succeed(); - } - - /** - * Asserts the intended contract: a request for exactly 1 unit with stock available - * should succeed. FAILS TODAY against the "if (toExtract > 1)" guard in - * ReactorInputFluidManager#extractFluids — acts as a regression marker for the fix. + * A request for exactly 1 unit with stock available must succeed. This used to fail against + * an {@code if (toExtract > 1)} guard that silently dropped single-unit requests. */ @GameTest(template = STRUCTURE) public static void extractFluids_needOfOne_shouldSucceed_expectedContract(GameTestHelper helper) { @@ -400,32 +380,10 @@ public static void extractFluids_needOfOne_shouldSucceed_expectedContract(GameTe } /** - * Characterizes the CURRENT (buggy) over-extraction: fluidNeeded is never - * decremented between handlers, so both handlers get drained in full. - * This test PASSES today. - */ - @GameTest(template = STRUCTURE) - public static void extractFluids_twoHandlers_currentBuggyBehavior_characterization(GameTestHelper helper) { - BlockPos rel1 = new BlockPos(1, 1, 1); - BlockPos rel2 = new BlockPos(3, 1, 1); - place(helper, rel1, Direction.NORTH); - place(helper, rel2, Direction.NORTH); - fill(helper, rel1, new FluidStack(Fluids.WATER, 10)); - fill(helper, rel2, new FluidStack(Fluids.WATER, 10)); - - manager(helper, rel1, rel2).extractFluids(helper.getLevel(), 10); - - helper.assertTrue(tankAmount(helper, rel1) == 0, "handler1 fully drained"); - helper.assertTrue(tankAmount(helper, rel2) == 0, - "handler2 is ALSO fully drained: over-extraction bug removes 20 units for a request of 10"); - helper.succeed(); - } - - /** - * Asserts the intended contract: extracting 10 units from a 20-unit pool spread - * across two handlers should leave 10 total remaining. FAILS TODAY because - * fluidNeeded is never decremented between handlers — this is the flagship - * regression marker for the main bug. + * Extracting 10 units from a 20-unit pool spread across two handlers must leave 10 total + * remaining. The requested amount is a total across every input, not a per-input quota; + * this used to drain both handlers in full because {@code fluidNeeded} was never + * decremented between them. */ @GameTest(template = STRUCTURE) public static void extractFluids_twoHandlers_shouldNotOverExtract_expectedContract(GameTestHelper helper) { @@ -478,20 +436,19 @@ public static void extractFluids_emptyStackHandler_skippedGracefully(GameTestHel } /** - * Documents a related contract mismatch found while designing this suite (not the - * main bug): the Javadoc promises "true if the full amount was extracted", - * but the implementation returns true after any partial extraction. This test - * asserts the CURRENT behavior and passes today; it is not a fix marker. + * A partial extraction still reports success: the reactor consumes whatever coolant it can + * reach rather than refusing to run. The Javadoc used to promise "true if the full amount + * was extracted", which never matched the implementation; it now documents this contract. */ @GameTest(template = STRUCTURE) - public static void extractFluids_returnsTrueEvenWhenNotFullyExtracted_javadocMismatch(GameTestHelper helper) { + public static void extractFluids_partialExtraction_stillReportsSuccess(GameTestHelper helper) { BlockPos rel = new BlockPos(1, 1, 1); place(helper, rel, Direction.NORTH); fill(helper, rel, new FluidStack(Fluids.WATER, 30)); boolean result = manager(helper, rel).extractFluids(helper.getLevel(), 100); - helper.assertTrue(result, "current implementation returns true even for a partial extraction (Javadoc mismatch)"); + helper.assertTrue(result, "a partial extraction should still report success"); helper.assertTrue(tankAmount(helper, rel) == 0, "all available fluid should have been drained"); helper.succeed(); } From 8aacafa6a278db69927f6062d30c4383382e19ad Mon Sep 17 00:00:00 2001 From: mathi Date: Thu, 6 Aug 2026 19:28:57 +0200 Subject: [PATCH 16/33] docs: record the extractFluids fix and the merge of origin/V2 Section 9.4 described extractFluids as a known bug present in both versions; it is fixed in both now, so it documents what the bug was and what the contract is. runGameTestServer exits 0 on both branches and can gate CI. Co-Authored-By: Claude Opus 5 (1M context) --- PORTAGE_REACTEUR.md | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/PORTAGE_REACTEUR.md b/PORTAGE_REACTEUR.md index 497762a..b5aab7e 100644 --- a/PORTAGE_REACTEUR.md +++ b/PORTAGE_REACTEUR.md @@ -12,8 +12,8 @@ Périmètre : domaine réacteur uniquement (`content/multiblock/**` + dépendanc > `ReactorControllerBlockEntity` : 868 lignes monolithiques → 424 lignes déléguantes, > divergence vs Forge ramenée de **864 lignes à 76** (toutes des adaptations 1.21). > -> Gametests : `./gradlew runGameTestServer` → **31 tests, 29 passent**, 2 échecs volontaires -> (marqueurs de régression `*_expectedContract`, qui échouent aussi sur Forge). +> Gametests : `./gradlew runGameTestServer` → **29 tests, tous verts** (`EXIT=0`). +> Utilisable en CI bloquante. > > Ce qui reste hors périmètre est inventorié en **§9**. @@ -350,16 +350,15 @@ Les deux gametests Forge (`DefaultHeatCalculatorGameTest`, `ReactorInputFluidMan ### Lot 8 — Gametests ✅ FAIT -`./gradlew runGameTestServer` — **30 tests, 28 passent, 2 échouent volontairement.** +`./gradlew runGameTestServer` — **29 tests, tous verts** (`EXIT=0`). Les 4 tests du modèle thermique passent, dont `threeByThreeDiamond` croisé avec le calculateur du wiki communautaire. C'est la première validation à l'exécution du portage. -Les 2 échecs sont les marqueurs de régression `*_expectedContract`, qui échouent **aussi sur -Forge** : `extractFluids` ne décrémente pas `fluidNeeded` entre les handlers (sur-extraction) et -ignore les demandes d'exactement 1 unité. Comportement identique des deux côtés — c'est ce qu'on -voulait vérifier. ⚠️ Conséquence : `runGameTestServer` sort en code 1. Ne pas le brancher en CI -bloquante avant d'avoir corrigé `extractFluids` (dans les deux repos). +> À l'écriture du lot, la suite comptait 31 tests dont 2 échouant volontairement : les marqueurs +> `*_expectedContract` du bug `extractFluids`, qui échouait identiquement sur Forge. Ce bug est +> corrigé depuis dans les deux repos (§9.4), les marqueurs sont donc passés au vert et les deux +> tests qui figeaient le comportement bogué ont été supprimés. **Adaptations du portage :** - `loadPattern` écrit un `ReactorBluePrintData` typé (57 `PatternData`) au lieu du tag NBT `pattern`. @@ -492,22 +491,30 @@ audité ligne à ligne, contrairement au domaine réacteur. Le lot 9 a montré que ces écarts cachent de vrais bugs : la capacité de stress et les `addLayer` manquants étaient tous les deux dans `CNBlocks`. -### 9.4 Bugs connus, présents dans les DEUX versions +### 9.4 Bug `extractFluids` ✅ CORRIGÉ dans les deux versions -À corriger dans les deux repos, pas seulement ici : +`ReactorInputFluidManager.extractFluids` ne décrémentait jamais `fluidNeeded` entre les +handlers : le montant demandé était traité comme un quota **par entrée** au lieu d'un total. +Un réacteur demandant 10 unités avec deux entrées de 10 les vidait toutes les deux, soit 20 +retirées. Plus le joueur posait d'entrées, plus le caloporteur disparaissait vite. -`ReactorInputFluidManager.extractFluids` ne décrémente jamais `fluidNeeded` entre les -handlers (**sur-extraction** : demander 10 unités en retire 10 par entrée) et ignore les -demandes d'exactement 1 unité (`if (toExtract > 1)`). Les deux gametests -`*_expectedContract` échouent volontairement là-dessus et deviendront verts une fois corrigé. -C'est aussi pour ça que `runGameTestServer` sort en code 1 : **ne pas le brancher en CI -bloquante** avant. +Un garde `if (toExtract > 1)` avalait aussi les demandes d'exactement 1 unité — précisément +ce que demande `FluidConsumptionRateCalculator` en bas de la courbe de consommation. + +Corrigé à l'identique dans les deux repos (implémentations byte-identical). Les deux tests +`*_expectedContract` passent, les deux tests qui figeaient le comportement bogué sont +supprimés, et le javadoc — qui promettait « true si le montant complet a été extrait » alors +que le code renvoyait true sur toute extraction partielle — documente désormais le vrai +contrat. + +**`runGameTestServer` sort maintenant en code 0 des deux côtés** (Forge 28 tests, +NeoForge 29) : il peut servir de garde-fou CI. ### 9.5 Ordre suggéré pour la suite -1. **Merger `origin/V2`** (4 commits d'avance) — un seul conflit attendu, un import dans `CNItems`. +1. ~~**Merger `origin/V2`**~~ ✅ fait — un seul conflit, l'import prévu dans `CNItems`. 2. **Jauges DisplayLink** — le plus visible, sans prérequis, le réacteur expose déjà tout. -3. **Corriger `extractFluids`** dans les deux repos, les tests passent au vert. +3. ~~**Corriger `extractFluids`**~~ ✅ fait dans les deux repos. 4. **Worldgen config** — silencieux mais fausse la génération de minerai. 5. **Vache irradiée + `IrradiatedAnimal`/`AnimalUtil`** — permet aussi de dédupliquer chat/loup/poulet. 6. Snow Powder, datagen manquant, compat Alex's Caves, mixins client. From 0727862a35a9ed1cb08bd65d04c65122a2bb1776 Mon Sep 17 00:00:00 2001 From: mathi Date: Thu, 6 Aug 2026 19:46:33 +0200 Subject: [PATCH 17/33] chore: remove potion.png Leftover screenshot at the repo root. Co-Authored-By: Claude Opus 5 (1M context) --- potion.png | Bin 54295 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 potion.png diff --git a/potion.png b/potion.png deleted file mode 100644 index 624428cbb922fa48425e192266cd5bda96091cec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54295 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 Date: Thu, 6 Aug 2026 20:55:28 +0200 Subject: [PATCH 18/33] docs: add the Forge -> NeoForge parity roadmap PARITE_FORGE_NEOFORGE.md lists every feature still missing from the NeoForge version, with the hook points to wire each one, a difficulty estimate and a suggested order. A raw tree diff reports 42 Forge files with no NeoForge counterpart, which is misleading. Eight exist under another name - two differ only by a typo - and four are deliberately not ported because the 1.21 equivalent is better: the radiation capability plumbing is replaced by NeoForge data attachments, CriterionTriggerBase by vanilla SimpleCriterionTrigger, and the bundled SimplexNoise by vanilla's. Re-porting those would be a regression, so they are called out explicitly. That leaves 30 real gaps, grouped by feature. The document also records what the reactor port taught us: the method that kept ~35 of 50 files byte-identical to Forge, the 1.21 translation table, and the two traps that compile and throw nothing - a CUSTOM_DATA tag read back as a defensive copy, and a persistent codec that fails at world-save time rather than at the write. Section 9 of PORTAGE_REACTEUR.md now points at it; that document stays focused on the reactor. Co-Authored-By: Claude Opus 5 (1M context) --- PARITE_FORGE_NEOFORGE.md | 343 +++++++++++++++++++++++++++++++++++++++ PORTAGE_REACTEUR.md | 4 + 2 files changed, 347 insertions(+) create mode 100644 PARITE_FORGE_NEOFORGE.md diff --git a/PARITE_FORGE_NEOFORGE.md b/PARITE_FORGE_NEOFORGE.md new file mode 100644 index 0000000..4a82bb3 --- /dev/null +++ b/PARITE_FORGE_NEOFORGE.md @@ -0,0 +1,343 @@ +# Parité Forge → NeoForge — ce qu'il reste à porter + +Ce document liste tout ce qui sépare encore `CreateNuclearNeoForge` de `CreateNuclearForge` +en termes de **features**, et comment porter chaque bloc. + +État au **6 août 2026**, branche `V2-Reacteur` (après merge d'`origin/V2`). +Pour le domaine réacteur, déjà porté et validé, voir [`PORTAGE_REACTEUR.md`](PORTAGE_REACTEUR.md). + +| | Forge | NeoForge | +|---|---|---| +| Fichiers `.java` | 296 | 281 | +| Ressources | 1 132 | 1 115 | + +--- + +## 0. Comment lire ce document + +Un `diff` brut des arborescences donne **42 fichiers Forge sans équivalent NeoForge**. +Ce chiffre est trompeur : + +- **8 existent, sous un autre nom** → §1, à ne jamais reporter comme manquants ; +- **4 sont remplacés par un équivalent 1.21 meilleur** → §2, à ne surtout pas « re-porter » ; +- **30 manquent réellement** → §3, c'est le vrai travail. + +S'y ajoutent des écarts *à l'intérieur* de fichiers présents des deux côtés (§4), invisibles +d'un diff d'arborescence — et c'est là qu'ont été trouvés la moitié des bugs du réacteur. + +--- + +## 1. Faux positifs — présents, mais renommés + +Aucune action. Deux d'entre eux ne diffèrent que par une **faute de frappe** côté NeoForge : +la corriger casserait des références, ce n'est pas prioritaire, mais c'est bon à savoir. + +| Forge | NeoForge | +|---|---| +| `content/multiblock/rod/CNRodTypes` | `content/rod/CNRodTypes` | +| `foundation/damageTypes/CNDamageSources` | `foundation/damage**s**Types/CNDamageSources` | +| `content/equipment/armor/ArmorMaterials` | `CNArmorMaterials` | +| `infrastructure/config/CExplode` | `CExplo**s**e` ⚠️ faute de frappe | +| `input/fluid/PlayerInteract**R**eactorFluidInput` | `PlayerInteract**e**ReactorFluidInput` ⚠️ faute de frappe | +| `content/biome/BiomeIrrad**a**tionExtractorItem` | `content/biome/BiomeIrrad**ia**tionExtractorItem` *(la faute est côté Forge)* | +| `irradiated/cat/CatLieOnBedGoal` | `IrradiatedCatLieOnBedGoal` | +| `irradiated/cat/CatSitOnBlockGoal` | `IrradiatedCatSitOnBlockGoal` | + +--- + +## 2. Volontairement non portés — l'équivalent 1.21 est meilleur + +**Ne pas porter ces fichiers.** Les recréer serait une régression. + +| Fichier Forge | Remplacé côté NeoForge par | +|---|---| +| `content/radiation/capability/IRadiationCapability` | **Data attachments NeoForge** — `RadiationCapability` expose `AttachmentType RADIATION`, lu via `entity.getData(RADIATION)` | +| `content/radiation/capability/RadiationProvider` | idem — la plomberie `ICapabilityProvider` de Forge n'a pas d'équivalent, ni de raison d'exister | +| `foundation/advancement/CriterionTriggerBase` | **`SimpleCriterionTrigger` vanilla** — `SimpleCreateNuclearTrigger` en hérite directement | +| `foundation/utility/SimplexNoise` | **`net.minecraft.world.level.levelgen.synth.SimplexNoise`** — `Maths` utilise déjà celui de vanilla | + +> ⚠️ La radiation mérite quand même une **vérification fonctionnelle** : `RadiationCapability` +> diverge de 186 lignes entre les deux versions. Le mécanisme est correct, mais rien ne dit que +> le comportement (seuils, décroissance, persistance à la mort) est identique. Ce n'est pas un +> portage de fichier, c'est un test en jeu à faire. + +--- + +## 3. Les 30 fichiers réellement manquants + +Classés par feature, du plus au moins impactant. + +--- + +### 3.1 Jauges DisplayLink du réacteur — 9 fichiers ⭐ priorité 1 + +`CNDisplaySources` · `AbstractReactorStatDisplaySource` · `HeatDisplaySource` · +`FuelDisplaySource` · `CoolerDisplaySource` · `LiquidLevelDisplaySource` · +`ReactorSizeDisplaySource` · `ReactorDisplayConstants` · `ReactorGaugeRenderer` + +**Ce qui manque en jeu :** impossible de brancher un Display Link sur une statistique précise +du réacteur. NeoForge n'a que `ReactorSummary` + `ReactorSummaryDisplaySource`, soit un résumé +global — pas la chaleur seule, le carburant seul, le niveau de liquide, ni la taille. + +**Points d'accroche.** Côté Forge, `CNBlocks` attache **six sources** au réacteur, à deux +endroits (le contrôleur et un second bloc, lignes 84-89 et 196-201) : + +```java +.transform(displaySource(CNDisplaySources.HEAT)) +.transform(displaySource(CNDisplaySources.LIQUID_LEVEL)) +.transform(displaySource(CNDisplaySources.FUEL)) +.transform(displaySource(CNDisplaySources.COOLER)) +.transform(displaySource(CNDisplaySources.REACTOR_SIZE)) +.transform(displaySource(CNDisplaySources.REACTOR_SUMMARY)) +``` + +`CNDisplaySources.register()` doit aussi être appelé depuis `CreateNuclear.java`. + +**Difficulté : faible.** Aucun prérequis — le lot 6 a déjà mis en place tout ce dont ces sources +ont besoin : `ReactorDisplayState`, `getMultiblockSize()`, `getInputFluidManager()`, +`getConfiguredPatternHeat()`. C'est de la traduction d'API quasi pure. + +**À savoir :** NeoForge possède en plus un `content/multiblock/frame/ReactorGaugeOverrides` +qui n'existe pas côté Forge — vérifier s'il fait doublon avec `ReactorGaugeRenderer` avant de +porter, pour ne pas se retrouver avec deux systèmes de jauges. + +--- + +### 3.2 Poudre de neige (Snow Powder) — 4 fichiers ⭐ priorité 2 + +`content/kinetics/fan/processing/SnowPowderRecipe` · `api/data/recipe/SnowPowderRecipeGen` · +`foundation/data/recipe/CNSnowPowderRecipeGen` · `compat/jei/category/FanSnowPowderCategory` + +**Ce qui manque en jeu :** un type de recette de ventilateur entier, avec sa catégorie JEI. +Aucune trace côté NeoForge — `CNRecipeTypes` n'a pas d'entrée `SNOW_POWDER`. + +**Points d'accroche :** +- `CNRecipeTypes` — ajouter `SNOW_POWDER(SnowPowderRecipe::new)` +- `CreateNuclearJEI` — enregistrer la catégorie (`builder(SnowPowderRecipe.class)`) +- le datagen `CNSnowPowderRecipeGen` doit être branché au provider de recettes +- vérifier les ressources associées (textures/lang de la catégorie JEI) + +**Difficulté : moyenne.** L'API des recettes Create a changé en 1.21 ; s'inspirer d'un type de +recette déjà porté (`CNEnrichedRecipeGen`, `EnrichedRecipeGen`) plutôt que de traduire à l'aveugle. + +--- + +### 3.3 Vache irradiée + abstraction des animaux — 5 fichiers ⭐ priorité 3 + +`IrradiatedCow` · `IrradiatedCowModel` · `IrradiatedCowRenderer` · +`IrradiatedAnimal` · `AnimalUtil` + +**Ce qui manque en jeu :** NeoForge a le **chat**, le **poulet** et le **loup** irradiés +(`CNEntityType` : `IRRADIATED_CAT`, `IRRADIATED_CHICKEN`, `IRRADIATED_WOLF`) — **pas la vache**. + +**Le vrai enjeu est l'abstraction.** Forge a factorisé le comportement commun dans +`IrradiatedAnimal` + `AnimalUtil` ; NeoForge ne les a pas, donc **chaque animal duplique la +logique**. C'est ce qui explique les plus gros diffs hors réacteur (`IrradiatedCat` 384 lignes, +`IrradiatedWolf` 333). Porter l'abstraction **en premier**, puis y ramener chat/poulet/loup, +puis ajouter la vache — sinon on ajoute une quatrième copie du même code. + +**Points d'accroche :** +- `CNEntityType` — `EntityEntry`, renderer, `createAttributes` +- `CNModelLayers` — `IRRADIATED_COW` + `registerLayerDefinition(..., IrradiatedCowModel::createBodyLayer)` +- ressources : modèle, texture, lang, table de butin, œuf d'apparition + +**Difficulté : moyenne à élevée.** Le refactor de l'abstraction touche trois entités existantes +qui fonctionnent aujourd'hui — à faire avec un test en jeu de chaque animal. + +--- + +### 3.4 Worldgen piloté par la config — 2 fichiers + +`infrastructure/worldgen/CNPlacementModifiers` · `infrastructure/worldgen/ConfigPlacementFilter` + +**Ce qui manque en jeu :** un filtre de placement qui lit la config avant de générer un minerai. +Sans lui, **les options de `CWorldGen` ne sont probablement pas respectées** : désactiver un +minerai dans la config n'a aucun effet. + +**Points d'accroche :** +- `CreateNuclear.java:80` → `CNPlacementModifiers.register(modEventBus)` +- `CNPlacedFeatures` (lignes 51 et 60 côté Forge) → `ConfigPlacementFilter.INSTANCE` dans la + liste des modificateurs de placement + +**Difficulté : faible à moyenne.** Le `PlacementModifierType` se déclare de la même façon en +1.21, mais l'enregistrement passe par un `DeferredRegister` NeoForge. + +⚠️ **À vérifier avant de porter** : NeoForge n'a peut-être aucun filtre, ou en a un autre. Un +`runData` sera nécessaire, et les features placées changeront — donc **monde de test neuf**. + +--- + +### 3.5 Datagen de recettes — 2 fichiers + +`foundation/data/recipe/CNDeployingRecipeGen` · `foundation/data/recipe/CNProcessingRecipeGen` + +**Ce qui manque en jeu :** des recettes qui existent côté Forge et pas côté NeoForge — +déployeur, et une base commune de recettes de traitement. + +**Difficulté : faible**, mais **impact direct sur la progression du joueur** : des objets +peuvent être tout simplement non craftables. À vérifier en jeu, JEI en main, en comparant les +deux versions côte à côte. + +--- + +### 3.6 Compat Alex's Caves — 2 fichiers + +`compat/Mods` · `compat/alexscave/AlexscaveCompat` + +**Ce qui manque en jeu :** l'explosion nucléaire n'a aucune intégration avec Alex's Caves. + +**Point d'accroche.** `NuclearExplosionEntity` côté Forge : + +```java +if (Mods.ALEXS_CAVE.isLoaded()) { + this.alexscaveHandler = new AlexscaveCompat(); +} +``` + +Le champ est typé `Object` volontairement, pour que la classe se charge même sans Alex's Caves. +Côté NeoForge, `NuclearExplosionEntity` n'en a aucune trace. + +`Mods` est un petit utilitaire générique de détection de mods — utile bien au-delà de cette compat. + +**Difficulté : faible.** `ModList.get().isLoaded(id)` existe à l'identique en NeoForge. + +--- + +### 3.7 Mixins client — 2 fichiers + +`foundation/mixin/client/CameraAccessor` · `foundation/mixin/client/GameRendererMixin` + +**Ce qui manque en jeu :** un effet visuel, très probablement lié au rendu de la radiation ou +de l'explosion (accès à la caméra + hook sur le `GameRenderer`). + +NeoForge a à la place `AntiRadiationArmorTextureMixin`, qui n'existe pas côté Forge : les deux +versions ont donc **divergé sur les mixins client**. Comparer les deux `createnuclear.mixins.json` +avant de porter. + +**Difficulté : moyenne.** Les mixins sont sensibles aux versions et cassent silencieusement. +À porter avec un test visuel explicite. + +--- + +### 3.8 Divers — 4 fichiers + +| Fichier | Ce qui manque en jeu | Point d'accroche | +|---|---|---| +| `foundation/item/RodsStats` | tooltip détaillé des barres (chaleur, durée de vie) | `CreateNuclear.java` — chaîné après `KineticStats.create(item)` dans le `TooltipModifier`. NeoForge a `KineticStats` mais **pas** `RodsStats` | +| `foundation/events/RodsTooltipHandler` | idem, côté événement | à brancher sur le bus d'événements | +| `content/uraniumOre/UraniumOreItem` | l'item de minerai d'uranium irradie le joueur qui le porte | `CNBlocks` lignes 378 et 444 côté Forge : `.item((b, p) -> new UraniumOreItem(b, p, 3))`. NeoForge n'utilise ni `UraniumOreItem` ni `RadiationItem` sur ces blocs | +| `CNOpenPipeEffectHandlers` | effets appliqués par les tuyaux ouverts Create | `CreateNuclear.java:105` — `CNOpenPipeEffectHandlers.registerDefaults()` | + +**Difficulté : faible** pour les quatre. Ce sont de bons premiers tickets. + +--- + +## 4. Écarts internes aux fichiers partagés — non audités + +Ces fichiers existent des deux côtés mais divergent fortement. **Un gros diff n'est pas une +preuve de feature manquante** : l'API 1.21 en explique une grande part. Aucun n'a été audité +ligne à ligne, contrairement au domaine réacteur. + +| Fichier | Lignes divergentes | +|---|---| +| `CNBlocks` | 701 | +| `CNItems` | 457 | +| `foundation/data/recipe/CNStandardRecipeGen` | 395 | +| `foundation/advancement/CNAdvancement` | 394 | +| `content/contraptions/irradiated/cat/IrradiatedCat` | 384 | +| `compat/jei/CreateNuclearJEI` | 344 | +| `content/contraptions/irradiated/wolf/IrradiatedWolf` | 333 | +| `CNCreativeModeTabs` | 249 | +| `content/radiation/capability/RadiationCapability` | 186 | + +> **Ce n'est pas théorique.** Sur les six bugs trouvés en testant le réacteur en jeu, **deux +> étaient cachés dans `CNBlocks`** : la capacité de stress de la sortie à `10240` au lieu de +> `64000` (SU divisé par 6,25) et quatre `addLayer` manquants — dont `reinforced_glass` qui +> rendait donc opaque. Aucun des deux n'était visible dans un diff d'arborescence. +> +> **Méthode qui a marché :** ne pas lire le diff en entier, mais partir d'un symptôme observé en +> jeu et remonter. C'est plus rapide et ça ne trouve que des bugs réels. + +--- + +## 5. Ordre de travail suggéré + +| # | Chantier | Fichiers | Difficulté | Pourquoi ce rang | +|---|---|---|---|---| +| 1 | **Jauges DisplayLink** | 9 | faible | Le manque le plus visible, zéro prérequis | +| 2 | **Divers (§3.8)** | 4 | faible | Quatre gains rapides et indépendants | +| 3 | **Datagen recettes** | 2 | faible | Peut bloquer la progression du joueur | +| 4 | **Worldgen config** | 2 | faible/moy. | Silencieux mais fausse la génération | +| 5 | **Compat Alex's Caves** | 2 | faible | Isolé, sans risque | +| 6 | **Snow Powder** | 4 | moyenne | Feature complète, API recettes à traduire | +| 7 | **Abstraction animaux + vache** | 5 | moy./élevée | Refactor de 3 entités qui marchent | +| 8 | **Mixins client** | 2 | moyenne | Sensible, à faire avec test visuel | +| 9 | **Audit `CNBlocks` / `CNItems`** | — | continu | À faire au fil des symptômes, pas d'un bloc | + +--- + +## 6. Méthode de portage — ce qui a marché sur le réacteur + +À reprendre pour chaque chantier ci-dessus. + +1. **Porter à l'identique par défaut.** Copier le fichier Forge, ne changer que ce que l'API + 1.21 impose. Sur le réacteur, ~35 fichiers sur 50 sont restés **identiques à l'octet**. +2. **Vérifier chaque fichier par un `diff`** contre son original Forge, et **justifier chaque + ligne qui diffère**. C'est ce qui a permis de garder les deux versions synchronisables. +3. **Compiler après chaque lot**, pas à la fin. +4. **Un commit par lot**, poussé avant d'enchaîner. +5. **Documenter toute divergence assumée** dans le commit, pour qu'une future synchro ne la + « corrige » pas par erreur. +6. **Tester en jeu.** Tout le portage du réacteur compilait et passait les gametests avant que + six bugs bien réels ne sortent au premier test manuel. + +### Pièges 1.20.1 → 1.21 déjà rencontrés + +| Forge 1.20.1 | NeoForge 1.21 | +|---|---| +| `net.minecraftforge.*` | `net.neoforged.neoforge.*` / `net.neoforged.api.*` | +| `ForgeRegistries.X.getKey(v)` | `BuiltInRegistries.X.getKey(v)` | +| `ForgeRegistries.X.getValue(rl)` | `BuiltInRegistries.X.getOptional(rl)` | +| `new ResourceLocation(s)` | `ResourceLocation.parse(s)` | +| `read/write(CompoundTag, boolean)` | `read/write(CompoundTag, HolderLookup.Provider, boolean)` | +| `ItemStack.of(tag)` | `ItemStack.parse(provider, tag)` → `Optional` | +| `stack.serializeNBT()` | `stack.saveOptional(provider)` | +| `stack.getOrCreateTag()` | **DataComponents** — pas d'équivalent mutable | +| `use(...)` → `InteractionResult` | `useItemOn(...)` → `ItemInteractionResult` | +| `NetworkHooks.openScreen(player, be, buf)` | `player.openMenu(be, buf)` | +| `isPathfindable(state, getter, pos, type)` | `isPathfindable(state, type)` | +| `data//structures/` | `data//structure/` *(singulier)* | +| capabilities `getCapability(...)` | `level.getCapability(Capabilities.X.BLOCK, pos, ctx)` | +| `ForgeCatnipServices.FLUID_RENDERER` | `CatnipServices.FLUID_RENDERER` — typé ``, **cast requis** | + +### Deux pièges qui ne cassent pas la compilation + +Ce sont les plus coûteux : le code compile, ne lève rien, et se comporte mal. + +1. **`stack.get(DataComponents.CUSTOM_DATA).copyTag()` renvoie une copie.** Traduire + `stack.getOrCreateTag().putX(...)` littéralement produit une écriture **silencieusement + perdue**. Passer par un composant typé et `stack.set(...)`. + +2. **Un codec persistant qui peut refuser une valeur fait planter la sauvegarde du monde**, + pas l'écriture — donc très loin de la cause. `CNDataComponents.HEAT` était déclaré + `ExtraCodecs.POSITIVE_FLOAT`, refusant `0.0`, la valeur normale d'un réacteur à l'arrêt. + **Valider les invariants en amont, pas dans le codec.** + +--- + +## 7. Vérifier l'état à tout moment + +```bash +# Fichiers Forge sans équivalent NeoForge (attention aux 8 renommés de §1) +cd ~/Documents/Ynov/Ydays +diff <(cd CreateNuclearForge/src && find . -name '*.java' | sort) \ + <(cd CreateNuclearNeoForge/src && find . -name '*.java' | sort) + +# Écart interne d'un fichier partagé +diff CreateNuclearForge/src/main/java/.../X.java \ + CreateNuclearNeoForge/src/main/java/.../X.java + +# Non-régression du réacteur — doit sortir en 0 des deux côtés +cd CreateNuclearNeoForge && ./gradlew runGameTestServer # 29 tests +cd CreateNuclearForge && ./gradlew runGameTestServer # 28 tests +``` diff --git a/PORTAGE_REACTEUR.md b/PORTAGE_REACTEUR.md index b5aab7e..3446aa3 100644 --- a/PORTAGE_REACTEUR.md +++ b/PORTAGE_REACTEUR.md @@ -381,6 +381,10 @@ Le reste du mod présente aussi des écarts. Inventaire complet en §9. ## 9. Ce qui n'est PAS porté de Forge vers NeoForge +> 📄 **Cette section est reprise et approfondie dans [`PARITE_FORGE_NEOFORGE.md`](PARITE_FORGE_NEOFORGE.md)**, +> qui détaille pour chaque feature manquante ses points d'accroche, sa difficulté et l'ordre de +> travail conseillé. Le présent document reste centré sur le réacteur. + État au 6 août 2026, branche `V2-Reacteur`. Le comptage brut donne **42 fichiers Forge sans équivalent NeoForge**, mais 6 sont en réalité présents sous un autre nom — le vrai reste est **36 fichiers**, plus des écarts internes sur des fichiers partagés. From 3f99c8784a55c269a8ffd14bec17bbe545b2edcb Mon Sep 17 00:00:00 2001 From: mathi Date: Fri, 7 Aug 2026 11:53:40 +0200 Subject: [PATCH 19/33] feat(displaylink): porter les jauges DisplayLink du reacteur Chantier 1 de PARITE_FORGE_NEOFORGE.md. Porte les 9 fichiers Forge qui manquaient, et branche la feature qui etait entierement morte cote NeoForge. Fichiers portes depuis Forge : - CNDisplaySources - content/redstone/displayLink/source/ : AbstractReactorStatDisplaySource, HeatDisplaySource, FuelDisplaySource, CoolerDisplaySource, LiquidLevelDisplaySource, ReactorSizeDisplaySource, ReactorDisplayConstants, ReactorGaugeRenderer Branchements (aucun display source n'etait attache cote NeoForge, pas meme REACTOR_SUMMARY : la classe existait mais n'etait referencee nulle part) : - CreateNuclear.java : CNDisplaySources.register() - CNBlocks : les 6 .transform(displaySource(...)) sur REACTOR_CASING et REACTOR_CONTROLLER ReactorSummaryDisplaySource : fuel / cooler / fluid / heat etaient commentes faute de ReactorGaugeRenderer. Reactives, ainsi que les branches "gauge" de formatValue/formatFluid. Le resume n'affichait que statut + taille. Divergences assumees vs Forge (ne pas les "corriger" a la prochaine synchro) : - CNDisplaySources : Registrate 1.21 type ses entrees RegistryEntry (registre + entree) la ou 1.20.1 n'avait que RegistryEntry. - HeatDisplaySource et ReactorSummaryDisplaySource : Forge lit la chaleur via getConfiguredPattern().getOrCreateTag().getDouble("heat"). En 1.21 elle vit dans le data component CNDataComponents.HEAT, et relire le tag NBT renvoie une copie defensive ou la valeur est toujours absente : le resume affichait donc 0. On passe par controller.getConfiguredPatternHeat(). - AbstractReactorStatDisplaySource, ReactorSizeDisplaySource : imports net.minecraftforge.api.distmarker -> net.neoforged.api.distmarker. - LiquidLevelDisplaySource : 8 imports inutilises supprimes (deja morts cote Forge). - FuelDisplaySource, CoolerDisplaySource, ReactorGaugeRenderer, ReactorDisplayConstants : identiques a l'octet. Toutes les cles de lang display_source.* etaient deja presentes dans interface.json, identiques a Forge. Aucun ajout de ressource necessaire. Verifie : compileJava OK, 29/29 gametests passent. A noter, hors perimetre de ce lot : runGameTestServer logue une IllegalStateException a la sauvegarde du chunk du controleur ("Value must be within range [1;99]: 0; Item must not be minecraft:air"), depuis SmartInventory.serializeNBT via ReactorControllerBlockEntity.write. Verifie preexistante (reproduite sur 9e7aba0 sans ce lot). A traiter a part. Co-Authored-By: Claude Opus 5 (1M context) --- .../nuclearteam/createnuclear/CNBlocks.java | 13 +++++ .../createnuclear/CNDisplaySources.java | 31 +++++++++++ .../createnuclear/CreateNuclear.java | 1 + .../AbstractReactorStatDisplaySource.java | 54 +++++++++++++++++++ .../source/CoolerDisplaySource.java | 46 ++++++++++++++++ .../displayLink/source/FuelDisplaySource.java | 45 ++++++++++++++++ .../displayLink/source/HeatDisplaySource.java | 41 ++++++++++++++ .../source/LiquidLevelDisplaySource.java | 43 +++++++++++++++ .../source/ReactorDisplayConstants.java | 9 ++++ .../source/ReactorGaugeRenderer.java | 15 ++++++ .../source/ReactorSizeDisplaySource.java | 54 +++++++++++++++++++ .../source/ReactorSummaryDisplaySource.java | 24 ++++----- 12 files changed, 364 insertions(+), 12 deletions(-) create mode 100644 src/main/java/net/nuclearteam/createnuclear/CNDisplaySources.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/AbstractReactorStatDisplaySource.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/CoolerDisplaySource.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/FuelDisplaySource.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/HeatDisplaySource.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/LiquidLevelDisplaySource.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorDisplayConstants.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorGaugeRenderer.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorSizeDisplaySource.java diff --git a/src/main/java/net/nuclearteam/createnuclear/CNBlocks.java b/src/main/java/net/nuclearteam/createnuclear/CNBlocks.java index bd34173..e651b97 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNBlocks.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNBlocks.java @@ -57,6 +57,7 @@ import net.nuclearteam.createnuclear.content.multiblock.reinforced.ReinforcedGlassBlock; import net.nuclearteam.createnuclear.content.uraniumOre.UraniumOreBlock; +import static com.simibubi.create.api.behaviour.display.DisplaySource.displaySource; import static com.simibubi.create.foundation.data.CreateRegistrate.casingConnectivity; import static com.simibubi.create.foundation.data.ModelGen.customItemModel; import static com.simibubi.create.foundation.data.TagGen.axeOrPickaxe; @@ -81,6 +82,12 @@ public class CNBlocks { .tag(BlockTags.NEEDS_DIAMOND_TOOL) .simpleItem() .transform(pickaxeOnly()) + .transform(displaySource(CNDisplaySources.HEAT)) + .transform(displaySource(CNDisplaySources.LIQUID_LEVEL)) + .transform(displaySource(CNDisplaySources.FUEL)) + .transform(displaySource(CNDisplaySources.COOLER)) + .transform(displaySource(CNDisplaySources.REACTOR_SIZE)) + .transform(displaySource(CNDisplaySources.REACTOR_SUMMARY)) .register(); public static final BlockEntry REACTOR_CORE = @@ -195,6 +202,12 @@ public class CNBlocks { .transform(pickaxeOnly()) .tag(BlockTags.NEEDS_DIAMOND_TOOL) .blockstate(new ReactorControllerGenerator()::generate) + .transform(displaySource(CNDisplaySources.HEAT)) + .transform(displaySource(CNDisplaySources.LIQUID_LEVEL)) + .transform(displaySource(CNDisplaySources.FUEL)) + .transform(displaySource(CNDisplaySources.COOLER)) + .transform(displaySource(CNDisplaySources.REACTOR_SIZE)) + .transform(displaySource(CNDisplaySources.REACTOR_SUMMARY)) .item() .transform(customItemModel("reactor", "controller", "item")) .register(); diff --git a/src/main/java/net/nuclearteam/createnuclear/CNDisplaySources.java b/src/main/java/net/nuclearteam/createnuclear/CNDisplaySources.java new file mode 100644 index 0000000..def1c7b --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/CNDisplaySources.java @@ -0,0 +1,31 @@ +package net.nuclearteam.createnuclear; + +import com.simibubi.create.api.behaviour.display.DisplaySource; +import com.simibubi.create.foundation.data.CreateRegistrate; +import com.tterrag.registrate.util.entry.RegistryEntry; +import net.nuclearteam.createnuclear.content.redstone.displayLink.source.*; + +import java.util.function.Supplier; + +public class CNDisplaySources { + private static final CreateRegistrate REGISTRATE = CreateNuclear.REGISTRATE; + + public static final RegistryEntry HEAT = simple("heat", HeatDisplaySource::new); + public static final RegistryEntry LIQUID_LEVEL = simple("liquid_level", LiquidLevelDisplaySource::new); + public static final RegistryEntry REACTOR_SUMMARY = simple("reactor_summary", ReactorSummaryDisplaySource::new); + public static final RegistryEntry FUEL = simple("fuel", FuelDisplaySource::new); + public static final RegistryEntry COOLER = simple("cooler", CoolerDisplaySource::new); + public static final RegistryEntry REACTOR_SIZE = simple("reactor_size", ReactorSizeDisplaySource::new); + + /** + * Divergence assumee vs Forge : en 1.21 Registrate type ses entrees + * {@code RegistryEntry} (type du registre + type de l'entree) la ou 1.20.1 + * n'avait que {@code RegistryEntry}. + */ + private static RegistryEntry simple(String name, Supplier supplier) { + return REGISTRATE.displaySource(name, supplier).register(); + } + + public static void register() { + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java b/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java index 1c31ed3..43526a2 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java +++ b/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java @@ -66,6 +66,7 @@ public static void onCtor(IEventBus modEventBus, ModContainer modContainer) { REGISTRATE.registerEventListeners(modEventBus); CNSoundEvents.prepare(); + CNDisplaySources.register(); CNTags.init(); CNBlocks.register(); CNBlockEntityTypes.register(); diff --git a/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/AbstractReactorStatDisplaySource.java b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/AbstractReactorStatDisplaySource.java new file mode 100644 index 0000000..1803ef7 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/AbstractReactorStatDisplaySource.java @@ -0,0 +1,54 @@ +package net.nuclearteam.createnuclear.content.redstone.displayLink.source; + +import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; +import com.simibubi.create.content.redstone.displayLink.source.NumericSingleLineDisplaySource; +import com.simibubi.create.content.redstone.displayLink.target.DisplayTargetStats; +import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; + +public abstract class AbstractReactorStatDisplaySource extends NumericSingleLineDisplaySource { + protected abstract String getLabelKey(); + protected abstract int getMax(); + protected abstract int computeValue(ReactorControllerBlockEntity controller, DisplayLinkContext context); + protected abstract ChatFormatting getColor(int value, ReactorControllerBlockEntity controller); + protected MutableComponent getUnitSuffix() { return null; } + + @Override + protected MutableComponent provideLine(DisplayLinkContext context, DisplayTargetStats stats) { + ReactorControllerBlockEntity controller = MultiblockHelpers.getControllerForPart(context.level(), context.getSourcePos()); + if (controller == null || controller.isRemoved()) return ZERO.copy(); + + MutableComponent label = CreateNuclearLang.translateDirect(getLabelKey()).append(" "); + int mode = context.sourceConfig().getInt("display_mode"); + int value = computeValue(controller, context); + int max = getMax(); + ChatFormatting color = getColor(value, controller); + + return label.append(switch (mode) { + case 1 -> Component.literal((value * 100 / max) + "%").withStyle(color); + case 2 -> ReactorGaugeRenderer.drawGauge(value, max, color, 6); + default -> { + MutableComponent base = Component.literal(String.valueOf(value)); + MutableComponent unit = getUnitSuffix(); + yield (unit != null ? base.append(unit) : base).withStyle(color); + } + }); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void initConfigurationWidgets(DisplayLinkContext context, ModularGuiLineBuilder builder, boolean isFirstLine) { + if (isFirstLine) return; + builder.addSelectionScrollInput(0, 100, (input, l) -> input + .forOptions(CreateNuclearLang.translatedOptions("display_source.reactor.mode", "value", "percent", "gauge")), "display_mode"); + } + + @Override protected boolean allowsLabeling(DisplayLinkContext context) { return true; } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/CoolerDisplaySource.java b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/CoolerDisplaySource.java new file mode 100644 index 0000000..ce7934b --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/CoolerDisplaySource.java @@ -0,0 +1,46 @@ +package net.nuclearteam.createnuclear.content.redstone.displayLink.source; + +import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; +import net.minecraft.ChatFormatting; +import net.minecraft.world.item.Item; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; + +import java.util.Map; + +public class CoolerDisplaySource extends AbstractReactorStatDisplaySource { + + + @Override + protected String getLabelKey() { + return "display_source.reactor.cooler"; + } + + @Override + protected int getMax() { + return ReactorDisplayConstants.MAX_COOLER; + } + + @Override + protected ChatFormatting getColor(int value, ReactorControllerBlockEntity controller) { + return ChatFormatting.AQUA; + } + + @Override + protected int computeValue(ReactorControllerBlockEntity controller, DisplayLinkContext context) { + int cooler = 0; + if (controller.getDisplayState() != null && controller.getDisplayState().items() != null) { + for (Map.Entry entry : controller.getDisplayState().items().entrySet()) { + if (RodType.TypeRodPredicate.isCooled(entry.getKey().getDefaultInstance(), context.level())) { + cooler += entry.getValue(); + } + } + } + return cooler; + } + + @Override + protected String getTranslationKey() { + return "cooler"; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/FuelDisplaySource.java b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/FuelDisplaySource.java new file mode 100644 index 0000000..56a8dc2 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/FuelDisplaySource.java @@ -0,0 +1,45 @@ +package net.nuclearteam.createnuclear.content.redstone.displayLink.source; + +import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; +import net.minecraft.ChatFormatting; +import net.minecraft.world.item.Item; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRodPredicate; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; + +import java.util.Map; + +public class FuelDisplaySource extends AbstractReactorStatDisplaySource { + + @Override + protected String getLabelKey() { + return "display_source.reactor.fuel"; + } + + @Override + protected int getMax() { + return ReactorDisplayConstants.MAX_FUEL; + } + + @Override + protected ChatFormatting getColor(int value, ReactorControllerBlockEntity controller) { + return ChatFormatting.GREEN; + } + + @Override + protected int computeValue(ReactorControllerBlockEntity controller, DisplayLinkContext context) { + int fuel = 0; + if (controller.getDisplayState() != null && controller.getDisplayState().items() != null) { + for (Map.Entry entry : controller.getDisplayState().items().entrySet()) { + if (TypeRodPredicate.isFuel(entry.getKey().getDefaultInstance(), context.level())) { + fuel += entry.getValue(); + } + } + } + return fuel; + } + + @Override + protected String getTranslationKey() { + return "fuel"; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/HeatDisplaySource.java b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/HeatDisplaySource.java new file mode 100644 index 0000000..9c58ffb --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/HeatDisplaySource.java @@ -0,0 +1,41 @@ +package net.nuclearteam.createnuclear.content.redstone.displayLink.source; + +import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; +import net.minecraft.ChatFormatting; +import net.nuclearteam.createnuclear.content.multiblock.IHeat; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; + +public class HeatDisplaySource extends AbstractReactorStatDisplaySource { + + @Override + protected String getLabelKey() { + return "display_source.reactor.heat"; + } + + @Override + protected int getMax() { + return ReactorDisplayConstants.MAX_HEAT; + } + + @Override + protected ChatFormatting getColor(int value, ReactorControllerBlockEntity controller) { + return IHeat.HeatLevel.of(value, controller.getMultiblockSize()).getTextColor(); + } + + /** + * Divergence assumee vs Forge : Forge lit + * {@code controller.getConfiguredPattern().getOrCreateTag().getDouble("heat")}. + * En 1.21 la chaleur vit dans le data component {@code CNDataComponents.HEAT} ; + * relire le tag NBT de la stack renvoie une copie defensive, donc la valeur y est + * toujours absente. On passe par l'accesseur dedie du controleur. + */ + @Override + protected int computeValue(ReactorControllerBlockEntity controller, DisplayLinkContext context) { + return controller.getConfiguredPatternHeat(); + } + + @Override + protected String getTranslationKey() { + return "heat"; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/LiquidLevelDisplaySource.java b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/LiquidLevelDisplaySource.java new file mode 100644 index 0000000..bbcb119 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/LiquidLevelDisplaySource.java @@ -0,0 +1,43 @@ +package net.nuclearteam.createnuclear.content.redstone.displayLink.source; + +import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.MutableComponent; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; + +import java.util.List; + +public class LiquidLevelDisplaySource extends AbstractReactorStatDisplaySource { + @Override + protected String getLabelKey() { + return "display_source.reactor.fluid"; + } + + @Override + protected int getMax() { + return ReactorDisplayConstants.MAX_FLUID; + } + + @Override + protected ChatFormatting getColor(int value, ReactorControllerBlockEntity controller) { + return ChatFormatting.BLUE; + } + + @Override + protected int computeValue(ReactorControllerBlockEntity controller, DisplayLinkContext context) { + List fluidList = controller.getBigFluidStack(); + return (fluidList != null && !fluidList.isEmpty()) ? fluidList.get(0).amount : 0; + } + + @Override + protected MutableComponent getUnitSuffix() { + return CreateNuclearLang.translateDirect("generic.unit.fluid.value"); + } + + @Override + protected String getTranslationKey() { + return "liquid_level"; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorDisplayConstants.java b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorDisplayConstants.java new file mode 100644 index 0000000..28360ff --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorDisplayConstants.java @@ -0,0 +1,9 @@ +package net.nuclearteam.createnuclear.content.redstone.displayLink.source; + +final class ReactorDisplayConstants { + static final int MAX_FUEL = 64; + static final int MAX_COOLER = 64; + static final int MAX_FLUID = 16000; + static final int MAX_HEAT = 1000; + private ReactorDisplayConstants() {} +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorGaugeRenderer.java b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorGaugeRenderer.java new file mode 100644 index 0000000..4b590b1 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorGaugeRenderer.java @@ -0,0 +1,15 @@ +package net.nuclearteam.createnuclear.content.redstone.displayLink.source; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.util.Mth; + +public final class ReactorGaugeRenderer { + private ReactorGaugeRenderer() {} + + static MutableComponent drawGauge(int current, int max, ChatFormatting color, int width) { + int filled = (int) (Mth.clamp((float) current / max, 0, 1) * width); + return Component.literal("█".repeat(filled) + "▒".repeat(Math.max(0, width - filled))).withStyle(color); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorSizeDisplaySource.java b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorSizeDisplaySource.java new file mode 100644 index 0000000..04faf4d --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorSizeDisplaySource.java @@ -0,0 +1,54 @@ +package net.nuclearteam.createnuclear.content.redstone.displayLink.source; + +import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; +import com.simibubi.create.content.redstone.displayLink.source.NumericSingleLineDisplaySource; +import com.simibubi.create.content.redstone.displayLink.target.DisplayTargetStats; +import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; + +public class ReactorSizeDisplaySource extends NumericSingleLineDisplaySource { + + @Override + protected MutableComponent provideLine(DisplayLinkContext context, DisplayTargetStats stats) { + ReactorControllerBlockEntity controller = MultiblockHelpers.getControllerForPart(context.level(), context.getSourcePos()); + if (controller == null || controller.isRemoved()) return ZERO.copy(); + + // Label + trailing space + MutableComponent label = CreateNuclearLang.translateDirect("display_source.reactor.size").append(" "); + + int mode = context.sourceConfig().getInt("display_mode"); + int size = controller.getMultiblockSize(); + int tier = size <= 5 ? 1 : size <= 7 ? 2 : 3; + + return label.append(switch (mode) { + case 1 -> Component.literal((tier * 100 / 3) + "%").withStyle(ChatFormatting.BLUE); + case 2 -> { + // Short 3-segment gauge representing the tier + yield Component.literal("█".repeat(tier) + "▒".repeat(3 - tier)).withStyle(ChatFormatting.BLUE); + } + default -> { + String key = tier == 1 ? "small" : tier == 2 ? "medium" : "large"; + yield CreateNuclearLang.translateDirect("display_source.reactor.size." + key).withStyle(ChatFormatting.BLUE); + } + }); + } + + @Override protected String getTranslationKey() { return "size"; } + + @Override + @OnlyIn(Dist.CLIENT) + public void initConfigurationWidgets(DisplayLinkContext context, ModularGuiLineBuilder builder, boolean isFirstLine) { + if (isFirstLine) return; + builder.addSelectionScrollInput(0, 100, (selectionScrollInput, l) -> selectionScrollInput + .forOptions(CreateNuclearLang.translatedOptions("display_source.reactor.mode", "value", "percent", "gauge")), "display_mode"); + } + + @Override protected boolean allowsLabeling(DisplayLinkContext context) { return true; } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorSummaryDisplaySource.java b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorSummaryDisplaySource.java index f789066..fc47350 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorSummaryDisplaySource.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorSummaryDisplaySource.java @@ -152,14 +152,14 @@ private Optional getReactorSummary(DisplayLinkContext context, i int mode = context.sourceConfig().getInt("display_mode"); - int heat = (int) controller.getConfiguredPattern() - .getOrDefault(net.minecraft.core.component.DataComponents.CUSTOM_DATA, net.minecraft.world.item.component.CustomData.EMPTY) - .copyTag() - .getDouble("heat"); + // Divergence assumee vs Forge, qui lit getConfiguredPattern().getOrCreateTag().getDouble("heat") : + // en 1.21 la chaleur vit dans le data component CNDataComponents.HEAT, et relire le tag NBT de la + // stack renvoie une copie defensive ou la valeur est toujours absente (elle valait donc 0 ici). + int heat = controller.getConfiguredPatternHeat(); int fuel = 0; int cooler = 0; - /*if (controller.getDisplayState() != null && controller.getDisplayState().items() != null) { + if (controller.getDisplayState() != null && controller.getDisplayState().items() != null) { for (Map.Entry entry : controller.getDisplayState().items().entrySet()) { if (TypeRodPredicate.isFuel(entry.getKey().getDefaultInstance(), context.level())) { fuel += entry.getValue(); @@ -167,7 +167,7 @@ private Optional getReactorSummary(DisplayLinkContext context, i cooler += entry.getValue(); } } - }*/ + } int size = controller.getMultiblockSize(); List fluidList = controller.getBigFluidStack(); @@ -186,10 +186,10 @@ private Optional getReactorSummary(DisplayLinkContext context, i CreateNuclearLang.translateDirect("display_source.reactor.active").withStyle(ChatFormatting.GOLD) : CreateNuclearLang.translateDirect("display_source.reactor.idle").withStyle(ChatFormatting.GRAY)) .size(lSize, formatSize(size)) - //.fuel(lFuel, formatValue(fuel, ReactorDisplayConstants.MAX_FUEL, mode, false, ChatFormatting.GREEN, gaugeWidth)) - //.cooler(lCooler, formatValue(cooler, ReactorDisplayConstants.MAX_COOLER, mode, false, ChatFormatting.AQUA, gaugeWidth)) - //.fluid(lFluid, formatFluid(fluid, ReactorDisplayConstants.MAX_FLUID, mode, ChatFormatting.BLUE, gaugeWidth)) - //.heat(lHeat, formatValue(heat, ReactorDisplayConstants.MAX_HEAT, mode, true, IHeat.HeatLevel.of(heat, controller.getMultiblockSize()).getTextColor(), gaugeWidth)) + .fuel(lFuel, formatValue(fuel, ReactorDisplayConstants.MAX_FUEL, mode, false, ChatFormatting.GREEN, gaugeWidth)) + .cooler(lCooler, formatValue(cooler, ReactorDisplayConstants.MAX_COOLER, mode, false, ChatFormatting.AQUA, gaugeWidth)) + .fluid(lFluid, formatFluid(fluid, ReactorDisplayConstants.MAX_FLUID, mode, ChatFormatting.BLUE, gaugeWidth)) + .heat(lHeat, formatValue(heat, ReactorDisplayConstants.MAX_HEAT, mode, true, IHeat.HeatLevel.of(heat, controller.getMultiblockSize()).getTextColor(), gaugeWidth)) .build()); } @@ -203,13 +203,13 @@ private MutableComponent formatSize(int size) { } private MutableComponent formatFluid(int current, int max, int mode, ChatFormatting color, int width) { - //if (mode == 0 || mode == 3) return ReactorGaugeRenderer.drawGauge(current, max, color, width); + if (mode == 0 || mode == 3) return ReactorGaugeRenderer.drawGauge(current, max, color, width); if (mode == 2) return Component.literal((current * 100 / max) + "%").withStyle(color); return Component.literal(String.valueOf(current)).append(" ").append(CreateNuclearLang.translateDirect("generic.unit.fluid.value")).withStyle(color); } private MutableComponent formatValue(int current, int max, int mode, boolean gaugeOnNormal, ChatFormatting color, int width) { - //if (mode == 3 || (mode == 0 && gaugeOnNormal)) return ReactorGaugeRenderer.drawGauge(current, max, color, width); + if (mode == 3 || (mode == 0 && gaugeOnNormal)) return ReactorGaugeRenderer.drawGauge(current, max, color, width); if (mode == 2) return Component.literal((current * 100 / max) + "%").withStyle(color); return Component.literal(String.valueOf(current)).withStyle(color); } From a8d1f1b18d0f0ba46116fe640d5e603cc9e40f6b Mon Sep 17 00:00:00 2001 From: mathi Date: Fri, 7 Aug 2026 12:39:01 +0200 Subject: [PATCH 20/33] fix(reactor): le controleur ne persistait plus des qu'il portait un blueprint PatternData.CODEC utilisait ItemStack.CODEC, qui refuse la stack vide ("Item must not be minecraft:air" / "Value must be within range [1;99]: 0"). Un motif de reacteur fait 57 slots et n'est presque jamais plein : des qu'un blueprint se trouvait dans un controleur, ReactorControllerBlockEntity.write levait a la sauvegarde du chunk, et Minecraft desactivait silencieusement la persistance du block entity ("It will not persist"). Le controleur perdait donc son blueprint a chaque rechargement du monde. Meme defaut sur le chemin reseau : PatternData.STREAM_CODEC utilisait ItemStack.STREAM_CODEC, qui leve EncoderException("Empty ItemStack not allowed"). REACTOR_BLUE_PRINT_DATA etant networkSynchronized, l'encodage echouait des que la stack partait vers un client. Correctif : ItemStack.OPTIONAL_CODEC et ItemStack.OPTIONAL_STREAM_CODEC. L'encodage des stacks non vides est inchange entre les deux variantes (seule la stack vide passe de "refusee" a "{}"), donc les blueprints deja sur disque se relisent sans migration. Le flatXmap qui entourait ItemStack.CODEC est supprime : sa condition (!stack.isEmpty() || stack.is(FUEL) || stack.is(COOLER)) etait morte, le premier disjoint rendant les deux autres inatteignables, et l'ensemble se reduisait a l'identite. ItemStack.CODEC refusait de toute facon les stacks vides avant meme que ce mapping ne les voie. C'est le piege n2 du paragraphe 6 de PARITE_FORGE_NEOFORGE.md, deja rencontre sur CNDataComponents.HEAT declare en POSITIVE_FLOAT : un codec persistant qui peut refuser une valeur fait planter la sauvegarde, tres loin de la cause. Le code compile, ne leve rien a l'ecriture, et perd les donnees. Verifie : 2 gametests de regression ajoutes (disque et reseau), qui echouent avant le correctif avec l'erreur de production exacte. 31/31 passent apres, et runGameTestServer ne logue plus aucune erreur de sauvegarde (5 avant). Verifie aussi les autres usages de ItemStack.CODEC/STREAM_CODEC du mod : CNDataComponents.ClothItemStack n'est ecrit que si l'item est un ClothItem, donc jamais vide ; les encodages de ReactorBluePrintItem/Menu portent sur le blueprint tenu en main, jamais vide. Rien d'autre a corriger. Co-Authored-By: Claude Opus 5 (1M context) --- .../multiblock/bluePrintItem/PatternData.java | 29 ++++--- .../DefaultHeatCalculatorGameTest.java | 87 ++++++++++++++++++- 2 files changed, 105 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/PatternData.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/PatternData.java index aefbe4c..1d880a3 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/PatternData.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/PatternData.java @@ -1,34 +1,43 @@ package net.nuclearteam.createnuclear.content.multiblock.bluePrintItem; import com.mojang.serialization.Codec; -import com.mojang.serialization.DataResult; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.ItemStack; -import net.nuclearteam.createnuclear.CNTags.CNItemTags; public record PatternData(int slot, ItemStack stack) { private static final ItemStack DEFAULT_STACK = ItemStack.EMPTY; + + /** + * Uses {@link ItemStack#OPTIONAL_CODEC}, not {@link ItemStack#CODEC}: a reactor pattern is 57 + * slots and is almost never full, and {@code ItemStack.CODEC} refuses the empty stack + * ("Item must not be minecraft:air" / "Value must be within range [1;99]: 0"). With the strict + * codec, any blueprint sitting in a controller made the block entity throw at chunk-save time, + * so the controller silently lost its blueprint on every world reload. + *

+ * The encoding of non-empty stacks is identical between the two codecs — only the empty stack + * changes, from "rejected" to {@code {}} — so blueprints already on disk still load. + */ public static final Codec CODEC = RecordCodecBuilder.create(i -> i.group( Codec.INT.fieldOf("slot").forGetter(PatternData::slot), - ItemStack.CODEC - .flatXmap(stack -> { - if (!stack.isEmpty() || stack.is(CNItemTags.FUEL.tag) || stack.is(CNItemTags.COOLER.tag)) return DataResult.success(stack); - return DataResult.success(DEFAULT_STACK); - }, - DataResult::success - ) + ItemStack.OPTIONAL_CODEC .fieldOf("Stack") .forGetter(PatternData::stack) ).apply(i, PatternData::new) ); + /** + * Uses {@link ItemStack#OPTIONAL_STREAM_CODEC} for the same reason as {@link #CODEC}: + * {@code ItemStack.STREAM_CODEC} throws {@code EncoderException("Empty ItemStack not allowed")} + * on the empty stack, and this component is {@code networkSynchronized}, so an unfilled pattern + * failed to encode as soon as the blueprint was sent to a client. + */ public static final StreamCodec STREAM_CODEC = StreamCodec.composite( ByteBufCodecs.INT, PatternData::slot, - ItemStack.STREAM_CODEC, PatternData::stack, + ItemStack.OPTIONAL_STREAM_CODEC, PatternData::stack, PatternData::new ); diff --git a/src/main/java/net/nuclearteam/createnuclear/gametest/DefaultHeatCalculatorGameTest.java b/src/main/java/net/nuclearteam/createnuclear/gametest/DefaultHeatCalculatorGameTest.java index 2895287..b2c4224 100644 --- a/src/main/java/net/nuclearteam/createnuclear/gametest/DefaultHeatCalculatorGameTest.java +++ b/src/main/java/net/nuclearteam/createnuclear/gametest/DefaultHeatCalculatorGameTest.java @@ -1,10 +1,12 @@ package net.nuclearteam.createnuclear.gametest; +import io.netty.buffer.Unpooled; import net.minecraft.core.BlockPos; import net.minecraft.gametest.framework.GameTest; import net.minecraft.gametest.framework.GameTestAssertException; import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.nbt.Tag; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.gametest.GameTestHolder; @@ -66,6 +68,11 @@ private static ReactorControllerInventory placeController(GameTestHelper helper, * {@code ReactorBluePrintItem.getItemStorage} bails out on a shorter array. */ private static void loadPattern(ReactorControllerInventory inventory, Map rodsBySlot) { + inventory.setStackInSlot(0, buildBlueprint(rodsBySlot)); + } + + /** Builds the blueprint {@link #loadPattern} loads, without touching an inventory. */ + private static ItemStack buildBlueprint(Map rodsBySlot) { PatternData[] pattern = new PatternData[PATTERN_SLOTS]; for (int slot = 0; slot < PATTERN_SLOTS; slot++) { Item rod = rodsBySlot.get(slot); @@ -75,7 +82,7 @@ private static void loadPattern(ReactorControllerInventory inventory, Map + * {@code PatternData.CODEC} used {@link ItemStack#CODEC}, which rejects the empty stack + * ("Item must not be minecraft:air" / "Value must be within range [1;99]: 0"). A reactor + * pattern is 57 slots and is almost never full, so any blueprint sitting in a controller made + * {@code ReactorControllerBlockEntity.write} throw at chunk-save time. The block entity then + * silently stopped persisting — the controller lost its blueprint on every world reload. + *

+ * The fix is {@link ItemStack#OPTIONAL_CODEC}, which encodes the empty stack as {@code {}} + * and leaves the encoding of non-empty stacks untouched, so blueprints already on disk still + * load. + */ + @GameTest(template = STRUCTURE) + public static void blueprintWithEmptyPatternSlots_survivesSerialization(GameTestHelper helper) { + ItemStack blueprint = buildBlueprint(Map.of(18, CNItems.THORIUM_ROD.get())); + + var registries = helper.getLevel().registryAccess(); + Tag saved; + try { + saved = blueprint.save(registries); + } catch (RuntimeException e) { + throw new GameTestAssertException( + "a blueprint whose pattern has empty slots must be serializable, got: " + e.getMessage()); + } + + ItemStack restored = ItemStack.parse(registries, saved).orElse(ItemStack.EMPTY); + ReactorBluePrintData data = restored.get(CNDataComponents.REACTOR_BLUE_PRINT_DATA); + helper.assertTrue(data != null, "the pattern component should round-trip through save/parse"); + + helper.assertTrue(data.pattern().length == PATTERN_SLOTS, + "all " + PATTERN_SLOTS + " pattern slots should round-trip, got " + data.pattern().length); + helper.assertTrue(data.pattern()[18].stack().is(CNItems.THORIUM_ROD.get()), + "the populated slot should keep its rod, got " + data.pattern()[18].stack()); + helper.assertTrue(data.pattern()[0].stack().isEmpty(), + "an empty slot should round-trip as empty, got " + data.pattern()[0].stack()); + helper.succeed(); + } + + // ================================================================ + // 0c. the same blueprint must survive being synced to a client + // ================================================================ + + /** + * Same defect as {@link #blueprintWithEmptyPatternSlots_survivesSerialization}, on the network + * path: {@code PatternData.STREAM_CODEC} used {@link ItemStack#STREAM_CODEC}, which throws + * {@code EncoderException("Empty ItemStack not allowed")} on the empty stack. Since + * {@code REACTOR_BLUE_PRINT_DATA} is registered as {@code networkSynchronized}, merely holding + * a blueprint would fail to encode when the stack was sent to a client. + */ + @GameTest(template = STRUCTURE) + public static void blueprintWithEmptyPatternSlots_survivesNetworkSync(GameTestHelper helper) { + ItemStack blueprint = buildBlueprint(Map.of(18, CNItems.THORIUM_ROD.get())); + + RegistryFriendlyByteBuf buf = + new RegistryFriendlyByteBuf(Unpooled.buffer(), helper.getLevel().registryAccess()); + try { + ItemStack.STREAM_CODEC.encode(buf, blueprint); + } catch (RuntimeException e) { + throw new GameTestAssertException( + "a blueprint whose pattern has empty slots must be network-encodable, got: " + e.getMessage()); + } + + ItemStack restored = ItemStack.STREAM_CODEC.decode(buf); + ReactorBluePrintData data = restored.get(CNDataComponents.REACTOR_BLUE_PRINT_DATA); + helper.assertTrue(data != null, "the pattern component should round-trip over the network"); + helper.assertTrue(data.pattern()[18].stack().is(CNItems.THORIUM_ROD.get()), + "the populated slot should keep its rod, got " + data.pattern()[18].stack()); + helper.assertTrue(data.pattern()[0].stack().isEmpty(), + "an empty slot should round-trip as empty, got " + data.pattern()[0].stack()); + helper.succeed(); + } + // ================================================================ // 1. single fuel rod, no neighbors // ================================================================ From 4cd8a46b680cb65d6100578244371f342d5e9871 Mon Sep 17 00:00:00 2001 From: mathi Date: Fri, 7 Aug 2026 13:28:22 +0200 Subject: [PATCH 21/33] docs: marquer le chantier 1 fait et consigner le bug de persistance - $3.1 Jauges DisplayLink : marque fait (3f99c87), diagnostic d'origine conserve en

et complete par ce qu'il sous-estimait (la feature etait morte, pas incomplete) ainsi que par les deux bugs trouves dans ReactorSummaryDisplaySource et la resolution du doublon ReactorGaugeOverrides. - $6 piege n2 : ajoute le cas PatternData / ItemStack.CODEC (a8d1f1b), et la lecon associee : les gametests ne rechargent pas le monde, l'erreur ne sortait que dans le log sous un 'All 29 tests passed'. - Journal des chantiers, compte de fichiers et nombre de gametests mis a jour. Co-Authored-By: Claude Opus 5 (1M context) --- PARITE_FORGE_NEOFORGE.md | 58 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 5 deletions(-) diff --git a/PARITE_FORGE_NEOFORGE.md b/PARITE_FORGE_NEOFORGE.md index 4a82bb3..9f2d27e 100644 --- a/PARITE_FORGE_NEOFORGE.md +++ b/PARITE_FORGE_NEOFORGE.md @@ -3,14 +3,21 @@ Ce document liste tout ce qui sépare encore `CreateNuclearNeoForge` de `CreateNuclearForge` en termes de **features**, et comment porter chaque bloc. -État au **6 août 2026**, branche `V2-Reacteur` (après merge d'`origin/V2`). +État au **7 août 2026**, branche `V2-Reacteur`. Pour le domaine réacteur, déjà porté et validé, voir [`PORTAGE_REACTEUR.md`](PORTAGE_REACTEUR.md). | | Forge | NeoForge | |---|---|---| -| Fichiers `.java` | 296 | 281 | +| Fichiers `.java` | 296 | 290 | | Ressources | 1 132 | 1 115 | +### Journal + +| Date | Chantier | Commit | +|---|---|---| +| 7 août | §3.1 Jauges DisplayLink — **fait** | `3f99c87` | +| 7 août | Bug de persistance du contrôleur (hors roadmap, trouvé en chemin) | `a8d1f1b` | + --- ## 0. Comment lire ce document @@ -69,7 +76,31 @@ Classés par feature, du plus au moins impactant. --- -### 3.1 Jauges DisplayLink du réacteur — 9 fichiers ⭐ priorité 1 +### 3.1 ~~Jauges DisplayLink du réacteur — 9 fichiers~~ ✅ FAIT le 7 août (`3f99c87`) + +> **Ce que le diagnostic ci-dessous sous-estimait.** La feature n'était pas *incomplète* côté +> NeoForge, elle était **entièrement morte** : `ReactorSummaryDisplaySource` existait mais +> n'était référencée nulle part — ni `CNDisplaySources`, ni le moindre +> `.transform(displaySource(...))` dans `CNBlocks`. Aucune source n'était donc proposée sur un +> Display Link, pas même le résumé. +> +> Deux bugs trouvés au passage dans `ReactorSummaryDisplaySource` : +> - carburant, refroidisseur, fluide et chaleur étaient **commentés** (faute de +> `ReactorGaugeRenderer`), ainsi que les branches « gauge » de `formatValue`/`formatFluid` ; +> - la chaleur était lue via `getConfiguredPattern().get(CUSTOM_DATA).copyTag()` — le piège n°1 +> du §6 — et valait donc **toujours 0**. Remplacé par `getConfiguredPatternHeat()`. +> +> La question du doublon `ReactorGaugeOverrides` est tranchée : **pas de doublon**. C'est un +> générateur de modèle d'item (datagen) pour la jauge du bloc `reactor_frame`, sans rapport avec +> `ReactorGaugeRenderer` qui dessine des barres `█▒` en texte. +> +> Toutes les clés de lang `display_source.*` étaient déjà présentes dans `interface.json`, +> identiques à Forge. Aucune ressource à ajouter. + +
+Diagnostic d'origine + +#### Jauges DisplayLink du réacteur — 9 fichiers ⭐ priorité 1 `CNDisplaySources` · `AbstractReactorStatDisplaySource` · `HeatDisplaySource` · `FuelDisplaySource` · `CoolerDisplaySource` · `LiquidLevelDisplaySource` · @@ -101,6 +132,8 @@ ont besoin : `ReactorDisplayState`, `getMultiblockSize()`, `getInputFluidManager qui n'existe pas côté Forge — vérifier s'il fait doublon avec `ReactorGaugeRenderer` avant de porter, pour ne pas se retrouver avec deux systèmes de jauges. +
+ --- ### 3.2 Poudre de neige (Snow Powder) — 4 fichiers ⭐ priorité 2 @@ -264,7 +297,7 @@ ligne à ligne, contrairement au domaine réacteur. | # | Chantier | Fichiers | Difficulté | Pourquoi ce rang | |---|---|---|---|---| -| 1 | **Jauges DisplayLink** | 9 | faible | Le manque le plus visible, zéro prérequis | +| ~~1~~ | ~~**Jauges DisplayLink**~~ ✅ | 9 | faible | Fait le 7 août — `3f99c87` | | 2 | **Divers (§3.8)** | 4 | faible | Quatre gains rapides et indépendants | | 3 | **Datagen recettes** | 2 | faible | Peut bloquer la progression du joueur | | 4 | **Worldgen config** | 2 | faible/moy. | Silencieux mais fausse la génération | @@ -323,6 +356,21 @@ Ce sont les plus coûteux : le code compile, ne lève rien, et se comporte mal. `ExtraCodecs.POSITIVE_FLOAT`, refusant `0.0`, la valeur normale d'un réacteur à l'arrêt. **Valider les invariants en amont, pas dans le codec.** + > **Ce piège a resservi le 7 août** (`a8d1f1b`), sur `PatternData` cette fois : + > `ItemStack.CODEC` **refuse la stack vide**, et un motif de réacteur fait 57 slots qui ne + > sont presque jamais tous remplis. Résultat : dès qu'un blueprint se trouvait dans un + > contrôleur, `ReactorControllerBlockEntity.write` levait à la sauvegarde du chunk et + > Minecraft désactivait silencieusement la persistance du block entity + > (« It will not persist ») — le contrôleur perdait son blueprint à chaque rechargement. + > Même défaut sur le chemin réseau avec `ItemStack.STREAM_CODEC`. + > **Réflexe 1.21 : pour un `ItemStack` qui peut être vide, c'est + > `ItemStack.OPTIONAL_CODEC` / `OPTIONAL_STREAM_CODEC`, jamais les variantes strictes.** + > + > Ce bug ne s'était pas vu aux gametests parce qu'ils **ne rechargent pas le monde** : + > l'erreur ne sortait que dans le log de `runGameTestServer`, à l'arrêt du serveur, pendant + > que « All 29 required tests passed » s'affichait juste au-dessus. **Lire le log, pas + > seulement le verdict.** + --- ## 7. Vérifier l'état à tout moment @@ -338,6 +386,6 @@ diff CreateNuclearForge/src/main/java/.../X.java \ CreateNuclearNeoForge/src/main/java/.../X.java # Non-régression du réacteur — doit sortir en 0 des deux côtés -cd CreateNuclearNeoForge && ./gradlew runGameTestServer # 29 tests +cd CreateNuclearNeoForge && ./gradlew runGameTestServer # 31 tests cd CreateNuclearForge && ./gradlew runGameTestServer # 28 tests ``` From b5534d2d3842f091d4a418c37cea176b3c28e424 Mon Sep 17 00:00:00 2001 From: mathi Date: Fri, 7 Aug 2026 13:56:30 +0200 Subject: [PATCH 22/33] refactor: aligner les 8 noms de fichiers divergents sur Forge Les deux depots portaient 8 fichiers identiques sous des noms differents, ce qui obligeait a les traiter comme des faux positifs a chaque diff d'arborescence (section 1 de PARITE_FORGE_NEOFORGE.md). Ils sont desormais nommes pareil des deux cotes. Sept renommages cote NeoForge, vers le nom Forge : content/rod/CNRodTypes -> content/multiblock/rod/CNRodTypes foundation/damagesTypes/ -> foundation/damageTypes/ CNArmorMaterials -> ArmorMaterials CExplose -> CExplode PlayerInteracteReactorFluidInput -> PlayerInteractReactorFluidInput IrradiatedCatLieOnBedGoal -> CatLieOnBedGoal IrradiatedCatSitOnBlockGoal -> CatSitOnBlockGoal Le cas damagesTypes n'etait pas qu'un nom : le fichier declarait deja "package ...foundation.damageTypes" alors qu'il vivait dans un dossier damagesTypes. Dossier et package se contredisaient ; seul le dossier bougeait. Le huitieme ecart est traite dans l'autre sens, dans le depot Forge : c'est Forge qui ecrivait BiomeIrradationExtractorItem, NeoForge avait deja l'orthographe correcte. Renommer NeoForge aurait propage la faute. Trois des nouveaux noms masquent une classe vanilla homonyme : ArmorMaterials (net.minecraft.world.item), CatLieOnBedGoal et CatSitOnBlockGoal (net.minecraft.world.entity.ai.goal). Les fichiers concernes importent ces packages en wildcard, mais une classe du meme package l'emporte sur un import a la demande, et aucun de ces fichiers n'utilise la classe vanilla homonyme. Forge compile ainsi depuis toujours. A savoir si l'un d'eux a un jour besoin de la version vanilla : il faudra la qualifier completement. Verifie : compileJava passe sur les deux depots, et le diff d'arborescence de la section 7 ne liste plus ces 8 fichiers. Aucune ressource touchee (aucune reference a ces noms hors .java). Co-Authored-By: Claude Opus 5 (1M context) --- PARITE_FORGE_NEOFORGE.md | 47 ++++++++++++++----- .../createnuclear/CreateNuclear.java | 4 +- .../api/multiblock/rods/RodType.java | 2 +- ...LieOnBedGoal.java => CatLieOnBedGoal.java} | 4 +- ...nBlockGoal.java => CatSitOnBlockGoal.java} | 4 +- .../irradiated/cat/IrradiatedCat.java | 4 +- .../armor/AntiRadiationArmorItem.java | 8 ++-- ...rmorMaterials.java => ArmorMaterials.java} | 2 +- ...a => PlayerInteractReactorFluidInput.java} | 2 +- .../input/fluid/ReactorFluidInput.java | 2 +- .../{ => multiblock}/rod/CNRodTypes.java | 2 +- .../CNDamageSources.java | 0 .../config/{CExplose.java => CExplode.java} | 2 +- .../infrastructure/config/CNCCommon.java | 2 +- .../data/GeneratedEntriesProvider.java | 2 +- 15 files changed, 55 insertions(+), 32 deletions(-) rename src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/{IrradiatedCatLieOnBedGoal.java => CatLieOnBedGoal.java} (90%) rename src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/{IrradiatedCatSitOnBlockGoal.java => CatSitOnBlockGoal.java} (92%) rename src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/{CNArmorMaterials.java => ArmorMaterials.java} (98%) rename src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/{PlayerInteracteReactorFluidInput.java => PlayerInteractReactorFluidInput.java} (99%) rename src/main/java/net/nuclearteam/createnuclear/content/{ => multiblock}/rod/CNRodTypes.java (96%) rename src/main/java/net/nuclearteam/createnuclear/foundation/{damagesTypes => damageTypes}/CNDamageSources.java (100%) rename src/main/java/net/nuclearteam/createnuclear/infrastructure/config/{CExplose.java => CExplode.java} (94%) diff --git a/PARITE_FORGE_NEOFORGE.md b/PARITE_FORGE_NEOFORGE.md index 9f2d27e..6ce4fee 100644 --- a/PARITE_FORGE_NEOFORGE.md +++ b/PARITE_FORGE_NEOFORGE.md @@ -17,6 +17,7 @@ Pour le domaine réacteur, déjà porté et validé, voir [`PORTAGE_REACTEUR.md` |---|---|---| | 7 août | §3.1 Jauges DisplayLink — **fait** | `3f99c87` | | 7 août | Bug de persistance du contrôleur (hors roadmap, trouvé en chemin) | `a8d1f1b` | +| 7 août | §1 Alignement des 8 noms de fichiers divergents — **fait** | voir §1 | --- @@ -34,21 +35,43 @@ d'un diff d'arborescence — et c'est là qu'ont été trouvés la moitié des b --- -## 1. Faux positifs — présents, mais renommés +## 1. ~~Faux positifs — présents, mais renommés~~ ✅ RÉSOLU le 7 août -Aucune action. Deux d'entre eux ne diffèrent que par une **faute de frappe** côté NeoForge : -la corriger casserait des références, ce n'est pas prioritaire, mais c'est bon à savoir. +**Les 8 noms sont désormais identiques des deux côtés.** Cette section ne décrit plus un écart +à connaître, mais un travail fait — elle est conservée pour l'historique. -| Forge | NeoForge | +Sept renommages ont eu lieu **côté NeoForge**, pour s'aligner sur Forge (référence) : + +| Avant (NeoForge) | Après (= Forge) | Motif | +|---|---|---| +| `content/rod/CNRodTypes` | `content/multiblock/rod/CNRodTypes` | package différent | +| `foundation/damage**s**Types/` | `foundation/damageTypes/` | le **dossier** seul était fautif — le `package` déclaré dans le fichier était déjà correct, donc dossier et package se contredisaient | +| `CNArmorMaterials` | `ArmorMaterials` | préfixe superflu | +| `infrastructure/config/CExplo**s**e` | `CExplode` | faute de frappe | +| `PlayerInteract**e**ReactorFluidInput` | `PlayerInteractReactorFluidInput` | faute de frappe | +| `IrradiatedCatLieOnBedGoal` | `CatLieOnBedGoal` | préfixe superflu | +| `IrradiatedCatSitOnBlockGoal` | `CatSitOnBlockGoal` | préfixe superflu | + +Le huitième était l'inverse — **la faute était côté Forge**, donc c'est **Forge** qui a été +renommé, pour que les deux convergent vers l'orthographe correcte : + +| Avant (Forge) | Après (= NeoForge) | |---|---| -| `content/multiblock/rod/CNRodTypes` | `content/rod/CNRodTypes` | -| `foundation/damageTypes/CNDamageSources` | `foundation/damage**s**Types/CNDamageSources` | -| `content/equipment/armor/ArmorMaterials` | `CNArmorMaterials` | -| `infrastructure/config/CExplode` | `CExplo**s**e` ⚠️ faute de frappe | -| `input/fluid/PlayerInteract**R**eactorFluidInput` | `PlayerInteract**e**ReactorFluidInput` ⚠️ faute de frappe | -| `content/biome/BiomeIrrad**a**tionExtractorItem` | `content/biome/BiomeIrrad**ia**tionExtractorItem` *(la faute est côté Forge)* | -| `irradiated/cat/CatLieOnBedGoal` | `IrradiatedCatLieOnBedGoal` | -| `irradiated/cat/CatSitOnBlockGoal` | `IrradiatedCatSitOnBlockGoal` | +| `content/biome/BiomeIrrad**a**tionExtractorItem` | `BiomeIrrad**ia**tionExtractorItem` | + +> ⚠️ **Trois de ces noms masquent volontairement une classe vanilla** : +> `ArmorMaterials` (`net.minecraft.world.item.ArmorMaterials`), `CatLieOnBedGoal` et +> `CatSitOnBlockGoal` (`net.minecraft.world.entity.ai.goal.*`). Les fichiers concernés importent +> le package vanilla en wildcard (`import net.minecraft.world.item.*;`, +> `import net.minecraft.world.entity.ai.goal.*;`) — c'est **sans danger** parce qu'en Java une +> classe du même package l'emporte sur un import à la demande, et qu'aucun de ces fichiers +> n'utilise la classe vanilla homonyme. Forge vit avec cette situation depuis toujours. +> **Mais si un jour l'un de ces fichiers a besoin de la version vanilla, il faudra la qualifier +> complètement** — un `import` simple ne suffira pas. +> +> `BiomeIrradiationExtractorItem.TAG` vaut `"biome_restore"` et l'item est enregistré sous +> `biome_irradiation_extractor` : le renommage Forge **ne touche donc aucune ressource**, ni +> aucun monde existant. --- diff --git a/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java b/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java index 43526a2..28d867f 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java +++ b/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java @@ -21,7 +21,7 @@ import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.registries.RegisterEvent; import net.nuclearteam.createnuclear.content.decoration.palettes.CNPaletteBlocks; -import net.nuclearteam.createnuclear.content.equipment.armor.CNArmorMaterials; +import net.nuclearteam.createnuclear.content.equipment.armor.ArmorMaterials; import net.nuclearteam.createnuclear.content.kinetics.fan.processing.CNFanProcessingTypes; import net.nuclearteam.createnuclear.content.radiation.CNRadiationValues; import net.nuclearteam.createnuclear.content.radiation.capability.RadiationCapability; @@ -77,7 +77,7 @@ public static void onCtor(IEventBus modEventBus, ModContainer modContainer) { CNEntityType.register(); CNPaletteBlocks.register(); - CNArmorMaterials.register(modEventBus); + ArmorMaterials.register(modEventBus); CNDataComponents.register(modEventBus); RadiationCapability.register(modEventBus); diff --git a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/rods/RodType.java b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/rods/RodType.java index f46f968..dbacc5e 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/rods/RodType.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/rods/RodType.java @@ -17,7 +17,7 @@ import net.nuclearteam.createnuclear.CNTags.CNItemTags; import net.nuclearteam.createnuclear.api.CreateNuclearRegistries; import net.nuclearteam.createnuclear.api.ItemRodTypesValue; -import net.nuclearteam.createnuclear.content.rod.CNRodTypes; +import net.nuclearteam.createnuclear.content.multiblock.rod.CNRodTypes; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/IrradiatedCatLieOnBedGoal.java b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/CatLieOnBedGoal.java similarity index 90% rename from src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/IrradiatedCatLieOnBedGoal.java rename to src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/CatLieOnBedGoal.java index 1c584a7..4e9fe7c 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/IrradiatedCatLieOnBedGoal.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/CatLieOnBedGoal.java @@ -10,10 +10,10 @@ import java.util.EnumSet; @ParametersAreNonnullByDefault -public class IrradiatedCatLieOnBedGoal extends MoveToBlockGoal { +public class CatLieOnBedGoal extends MoveToBlockGoal { private final IrradiatedCat irradiatedCat; - public IrradiatedCatLieOnBedGoal(IrradiatedCat cat, double speedModifier, int searchRange) { + public CatLieOnBedGoal(IrradiatedCat cat, double speedModifier, int searchRange) { super(cat, speedModifier, searchRange, 6); this.irradiatedCat = cat; this.verticalSearchStart = -2; diff --git a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/IrradiatedCatSitOnBlockGoal.java b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/CatSitOnBlockGoal.java similarity index 92% rename from src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/IrradiatedCatSitOnBlockGoal.java rename to src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/CatSitOnBlockGoal.java index 2d0e460..d43d398 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/IrradiatedCatSitOnBlockGoal.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/CatSitOnBlockGoal.java @@ -11,10 +11,10 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BedPart; -public class IrradiatedCatSitOnBlockGoal extends MoveToBlockGoal { +public class CatSitOnBlockGoal extends MoveToBlockGoal { private final IrradiatedCat irradiatedCat; - public IrradiatedCatSitOnBlockGoal(IrradiatedCat cat, double speedModifier) { + public CatSitOnBlockGoal(IrradiatedCat cat, double speedModifier) { super(cat, speedModifier, 8); this.irradiatedCat = cat; } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/IrradiatedCat.java b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/IrradiatedCat.java index 3472b19..20c8a6f 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/IrradiatedCat.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/IrradiatedCat.java @@ -66,9 +66,9 @@ protected void registerGoals() { this.goalSelector.addGoal(2, new SitWhenOrderedToGoal(this)); this.goalSelector.addGoal(3, new IrradiatedCatRelaxOnOwnerGoal(this)); this.goalSelector.addGoal(4, this.temptGoal); - this.goalSelector.addGoal(5, new IrradiatedCatLieOnBedGoal(this, 1.1, 8)); + this.goalSelector.addGoal(5, new CatLieOnBedGoal(this, 1.1, 8)); this.goalSelector.addGoal(6, new FollowOwnerGoal(this, 1.0F, 10.0F, 5.0F)); - this.goalSelector.addGoal(7, new IrradiatedCatSitOnBlockGoal(this, 0.8)); + this.goalSelector.addGoal(7, new CatSitOnBlockGoal(this, 0.8)); this.goalSelector.addGoal(8, new LeapAtTargetGoal(this, 0.3F)); this.goalSelector.addGoal(9, new OcelotAttackGoal(this)); this.goalSelector.addGoal(10, new BreedGoal(this, 0.8)); diff --git a/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/AntiRadiationArmorItem.java b/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/AntiRadiationArmorItem.java index 9b67964..76061f5 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/AntiRadiationArmorItem.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/AntiRadiationArmorItem.java @@ -60,25 +60,25 @@ public static NonNullUnaryOperator> setColo public static class Helmet extends AntiRadiationArmorItem implements IGoggleHelmet { public Helmet(Properties p) { - super(CNArmorMaterials.ANTI_RADIATION_SUIT, Type.HELMET, p); + super(ArmorMaterials.ANTI_RADIATION_SUIT, Type.HELMET, p); } } public static class Chestplate extends AntiRadiationArmorItem { public Chestplate(Properties p) { - super(CNArmorMaterials.ANTI_RADIATION_SUIT, Type.CHESTPLATE, p); + super(ArmorMaterials.ANTI_RADIATION_SUIT, Type.CHESTPLATE, p); } } public static class Leggings extends AntiRadiationArmorItem { public Leggings(Properties p) { - super(CNArmorMaterials.ANTI_RADIATION_SUIT, Type.LEGGINGS, p); + super(ArmorMaterials.ANTI_RADIATION_SUIT, Type.LEGGINGS, p); } } public static class Boot extends AntiRadiationArmorItem { public Boot(Properties p) { - super(CNArmorMaterials.ANTI_RADIATION_SUIT, Type.BOOTS, p); + super(ArmorMaterials.ANTI_RADIATION_SUIT, Type.BOOTS, p); } } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/CNArmorMaterials.java b/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/ArmorMaterials.java similarity index 98% rename from src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/CNArmorMaterials.java rename to src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/ArmorMaterials.java index de77dfe..dc49234 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/CNArmorMaterials.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/ArmorMaterials.java @@ -18,7 +18,7 @@ import java.util.List; import java.util.function.Supplier; -public class CNArmorMaterials { +public class ArmorMaterials { private static final DeferredRegister ARMOR_MATERIALS = DeferredRegister.create(Registries.ARMOR_MATERIAL, CreateNuclear.MOD_ID); public static final Holder ANTI_RADIATION_SUIT = register( diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/PlayerInteracteReactorFluidInput.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/PlayerInteractReactorFluidInput.java similarity index 99% rename from src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/PlayerInteracteReactorFluidInput.java rename to src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/PlayerInteractReactorFluidInput.java index 5cb663f..ca1db27 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/PlayerInteracteReactorFluidInput.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/PlayerInteractReactorFluidInput.java @@ -24,7 +24,7 @@ import net.neoforged.neoforge.fluids.FluidStack; import net.neoforged.neoforge.fluids.capability.IFluidHandler; -public class PlayerInteracteReactorFluidInput { +public class PlayerInteractReactorFluidInput { public static InteractionResult interact(Level level, BlockPos pos, Player player, InteractionHand hand, ItemStack stack, boolean onClient, BlockHitResult ray) { FluidExchange exchange = null; ReactorFluidInputEntity be = (ReactorFluidInputEntity) level.getBlockEntity(pos); diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInput.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInput.java index 00c6713..d70af53 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInput.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInput.java @@ -86,7 +86,7 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { if (!player.isCreative()) return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; - InteractionResult result = PlayerInteracteReactorFluidInput.interact(world, pos, player, hand, heldItem, onClient, ray); + InteractionResult result = PlayerInteractReactorFluidInput.interact(world, pos, player, hand, heldItem, onClient, ray); // Convertit le vieux InteractionResult en ItemInteractionResult si nécessaire pour NeoForge return result.consumesAction() ? ItemInteractionResult.SUCCESS : ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; diff --git a/src/main/java/net/nuclearteam/createnuclear/content/rod/CNRodTypes.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/rod/CNRodTypes.java similarity index 96% rename from src/main/java/net/nuclearteam/createnuclear/content/rod/CNRodTypes.java rename to src/main/java/net/nuclearteam/createnuclear/content/multiblock/rod/CNRodTypes.java index 2b90239..9ce48e9 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/rod/CNRodTypes.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/rod/CNRodTypes.java @@ -1,4 +1,4 @@ -package net.nuclearteam.createnuclear.content.rod; +package net.nuclearteam.createnuclear.content.multiblock.rod; import net.minecraft.data.worldgen.BootstrapContext; import net.minecraft.resources.ResourceKey; diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/damagesTypes/CNDamageSources.java b/src/main/java/net/nuclearteam/createnuclear/foundation/damageTypes/CNDamageSources.java similarity index 100% rename from src/main/java/net/nuclearteam/createnuclear/foundation/damagesTypes/CNDamageSources.java rename to src/main/java/net/nuclearteam/createnuclear/foundation/damageTypes/CNDamageSources.java diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CExplose.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CExplode.java similarity index 94% rename from src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CExplose.java rename to src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CExplode.java index 1f27167..279a7c1 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CExplose.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CExplode.java @@ -2,7 +2,7 @@ import net.createmod.catnip.config.ConfigBase; -public class CExplose extends ConfigBase { +public class CExplode extends ConfigBase { public final ConfigInt size = i(10, "Size of the reactor explosion"); public final ConfigInt type = i(1, 0, 2, "Type of explosion", Comments.type); public final ConfigInt time = i(600, 100, 1200, "Duration before exploration", Comments.explosionTime, Comments.hintExplosion); diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCCommon.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCCommon.java index cf642f7..0672786 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCCommon.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCCommon.java @@ -5,7 +5,7 @@ public class CNCCommon extends ConfigBase { public final CWorldGen worldGen = nested(0, CWorldGen::new, Comments.worldGen); public final CRods rods = nested(0, CRods::new, Comments.rods); - public final CExplose explode = nested(0, CExplose::new, Comments.explode); + public final CExplode explode = nested(0, CExplode::new, Comments.explode); @Override public String getName() { diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/GeneratedEntriesProvider.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/GeneratedEntriesProvider.java index 7bf61c1..21b4d48 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/GeneratedEntriesProvider.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/GeneratedEntriesProvider.java @@ -11,7 +11,7 @@ import net.nuclearteam.createnuclear.CreateNuclear; import net.nuclearteam.createnuclear.api.CreateNuclearRegistries; import net.nuclearteam.createnuclear.content.multiblock.fluid.CNReactorFluidTypes; -import net.nuclearteam.createnuclear.content.rod.CNRodTypes; +import net.nuclearteam.createnuclear.content.multiblock.rod.CNRodTypes; import net.nuclearteam.createnuclear.infrastructure.worldgen.CNBiomeModifiers; import net.nuclearteam.createnuclear.infrastructure.worldgen.CNConfiguredFeatures; import net.nuclearteam.createnuclear.infrastructure.worldgen.CNPlacedFeatures; From 489d7a1772eb5ca45f11ff879f3d5777d7eab86f Mon Sep 17 00:00:00 2001 From: mathi Date: Fri, 7 Aug 2026 14:31:37 +0200 Subject: [PATCH 23/33] feat(radiation): porter les 4 fichiers divers du chantier 2 Chantier 2 de PARITE_FORGE_NEOFORGE.md (section 3.8) : RodsStats, RodsTooltipHandler, UraniumOreItem et CNOpenPipeEffectHandlers. Les quatre sont portes a l'identique de Forge, seule l'API 1.21 change (ItemTooltipEvent passe sous net.neoforged, ForgeRegistries.ITEMS.getKey -> BuiltInRegistries.ITEM.getKey, @Mod.EventBusSubscriber -> @EventBusSubscriber sans attribut bus, le bus GAME etant le defaut en NeoForge et l'attribut etant deprecie). CNOpenPipeEffectHandlers etait le fichier important. RadiationEffectHandler existait deja cote NeoForge, complet et correct, mais n'etait reference nulle part faute de ce point d'enregistrement : un tuyau ouvert Create crachant de l'uranium n'irradiait donc personne. C'est le meme schema que les jauges DisplayLink du chantier 1 -- une feature entierement morte plutot qu'incomplete. Deux cas en deux chantiers : cote NeoForge, chercher systematiquement les classes jamais referencees. Deux ecarts avec le diagnostic de la roadmap, trouves en portant : - trois blocs portent UraniumOreItem cote Forge, pas deux. La roadmap citait uranium_ore et deepslate_uranium_ore (radiation 3), et oubliait raw_uranium_block, dont la radiation vaut 27. Les trois sont branches. - la cle de lang tooltip.ratio manquait cote NeoForge, alors que les cinq autres cles tooltip.* des barres etaient deja presentes. Sans elle, RodsStats aurait affiche la cle brute. Ajoutee dans lang/default et regeneree via runData (en_us et en_ud). RodsStats et RodsTooltipHandler ne font pas doublon, malgre les apparences : RodsStats est branche sur setTooltipModifierFactory de Registrate, qui ne couvre que les items du mod ; RodsTooltipHandler ecoute ItemTooltipEvent et ne sert que les items externes (autres mods, ou RodType definis par datapack et resolus au runtime), d'ou son return anticipe sur le namespace createnuclear. Supprimer l'un des deux ou inverser la condition double le tooltip des barres du mod. Le commentaire qui le dit est present dans le fichier, des deux cotes. Verifie : compileJava passe, runData ne produit que la cle de lang ajoutee (aucune regeneration de modele malgre le passage de .item() a .item((b, p) -> new UraniumOreItem(...))), et 31/31 gametests passent sans aucune erreur dans le log complet. Non verifie -- aucun gametest ne couvre ces trois comportements, ils demandent un test en jeu : 1. tooltip d'une barre : cinq lignes de stats, type en vert (FUEL) ou cyan ; 2. raw_uranium_block en inventaire : la radiation monte de 27 par item ; 3. tuyau ouvert crachant de l'uranium : irradie les entites de la zone. Co-Authored-By: Claude Opus 5 (1M context) --- PARITE_FORGE_NEOFORGE.md | 55 +++++++++++++--- .../35ba5b194a3aa18fb27424c32b9e16e01b900a51 | 6 +- .../assets/createnuclear/lang/en_ud.json | 1 + .../assets/createnuclear/lang/en_us.json | 1 + .../nuclearteam/createnuclear/CNBlocks.java | 7 +- .../CNOpenPipeEffectHandlers.java | 10 +++ .../createnuclear/CreateNuclear.java | 3 + .../content/uraniumOre/UraniumOreItem.java | 21 ++++++ .../foundation/events/RodsTooltipHandler.java | 35 ++++++++++ .../foundation/item/RodsStats.java | 65 +++++++++++++++++++ .../createnuclear/lang/default/tooltips.json | 1 + 11 files changed, 191 insertions(+), 14 deletions(-) create mode 100644 src/main/java/net/nuclearteam/createnuclear/CNOpenPipeEffectHandlers.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/uraniumOre/UraniumOreItem.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/foundation/events/RodsTooltipHandler.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/foundation/item/RodsStats.java diff --git a/PARITE_FORGE_NEOFORGE.md b/PARITE_FORGE_NEOFORGE.md index 6ce4fee..9770afb 100644 --- a/PARITE_FORGE_NEOFORGE.md +++ b/PARITE_FORGE_NEOFORGE.md @@ -8,7 +8,7 @@ Pour le domaine réacteur, déjà porté et validé, voir [`PORTAGE_REACTEUR.md` | | Forge | NeoForge | |---|---|---| -| Fichiers `.java` | 296 | 290 | +| Fichiers `.java` | 296 | 294 | | Ressources | 1 132 | 1 115 | ### Journal @@ -17,18 +17,24 @@ Pour le domaine réacteur, déjà porté et validé, voir [`PORTAGE_REACTEUR.md` |---|---|---| | 7 août | §3.1 Jauges DisplayLink — **fait** | `3f99c87` | | 7 août | Bug de persistance du contrôleur (hors roadmap, trouvé en chemin) | `a8d1f1b` | -| 7 août | §1 Alignement des 8 noms de fichiers divergents — **fait** | voir §1 | +| 7 août | §1 Alignement des 8 noms de fichiers divergents — **fait** | `b5534d2` + `b1ca4644` (Forge) | +| 7 août | §3.8 Divers (4 fichiers) — **fait** | voir §3.8 | --- ## 0. Comment lire ce document -Un `diff` brut des arborescences donne **42 fichiers Forge sans équivalent NeoForge**. -Ce chiffre est trompeur : +**Au départ**, un `diff` brut des arborescences donnait **42 fichiers Forge sans équivalent +NeoForge**. Ce chiffre était trompeur : -- **8 existent, sous un autre nom** → §1, à ne jamais reporter comme manquants ; +- **8 existaient, sous un autre nom** → §1, **réglé** : les noms sont désormais alignés, ces + fichiers ne polluent plus le diff ; - **4 sont remplacés par un équivalent 1.21 meilleur** → §2, à ne surtout pas « re-porter » ; -- **30 manquent réellement** → §3, c'est le vrai travail. +- **30 manquaient réellement** → §3, c'est le vrai travail. + +**Aujourd'hui**, le même `diff` en donne **21**. L'écart avec les 42 du départ se décompose ainsi : +8 renommages (§1) + 9 fichiers portés au chantier 1 (§3.1) + 4 au chantier 2 (§3.8). +Sur ces 21 restants, **4 ne sont pas à porter** (§2) : il reste donc **17 fichiers de vrai travail**. S'y ajoutent des écarts *à l'intérieur* de fichiers présents des deux côtés (§4), invisibles d'un diff d'arborescence — et c'est là qu'ont été trouvés la moitié des bugs du réacteur. @@ -275,7 +281,25 @@ avant de porter. --- -### 3.8 Divers — 4 fichiers +### 3.8 ~~Divers — 4 fichiers~~ ✅ FAIT le 7 août + +> **Ce que le diagnostic ci-dessous ratait.** Comme pour les jauges DisplayLink (§3.1), le vrai +> problème n'était pas seulement l'absence de fichiers, mais une feature **entièrement morte** : +> `RadiationEffectHandler` existait déjà côté NeoForge, complet et correct — mais +> `CNOpenPipeEffectHandlers` manquait, donc **il n'était référencé nulle part**. Un tuyau ouvert +> Create crachant de l'uranium n'irradiait donc personne. C'est le deuxième cas identique en deux +> chantiers : **côté NeoForge, chercher systématiquement les classes jamais référencées.** +> +> Deux écarts avec le diagnostic d'origine : +> - **trois** blocs portent `UraniumOreItem` côté Forge, pas deux : `uranium_ore` (3), +> `deepslate_uranium_ore` (3) et surtout `raw_uranium_block` (**27**), qui avait été oublié ; +> - la clé de lang `tooltip.ratio` **manquait** côté NeoForge (les cinq autres clés `tooltip.*` +> des barres étaient déjà là). Sans elle, `RodsStats` aurait affiché la clé brute. + +
+Diagnostic d'origine + +#### Divers — 4 fichiers | Fichier | Ce qui manque en jeu | Point d'accroche | |---|---|---| @@ -286,6 +310,21 @@ avant de porter. **Difficulté : faible** pour les quatre. Ce sont de bons premiers tickets. +
+ +> ⚠️ **`RodsTooltipHandler` et `RodsStats` ne font pas doublon**, malgré les apparences. +> `RodsStats` est branché sur `setTooltipModifierFactory` de Registrate, qui ne couvre **que les +> items du mod**. `RodsTooltipHandler` écoute l'`ItemTooltipEvent` et sert **uniquement les items +> externes** (autres mods, ou `RodType` définis par datapack et résolus au runtime) — d'où le +> `return` anticipé quand le namespace est `createnuclear`. **Ne pas « simplifier » en supprimant +> l'un des deux ni en inversant la condition : on double le tooltip des barres du mod.** +> Le commentaire est présent dans le fichier des deux côtés. + +**À tester en jeu** (rien de tout cela n'est couvert par les gametests) : +1. tooltip d'une barre d'uranium/graphite → cinq lignes de stats, type en vert (FUEL) ou cyan ; +2. porter du `raw_uranium_block` en inventaire → la radiation monte (27 × la taille du stack) ; +3. tuyau ouvert Create crachant de l'uranium → irradie les entités dans la zone. + --- ## 4. Écarts internes aux fichiers partagés — non audités @@ -321,7 +360,7 @@ ligne à ligne, contrairement au domaine réacteur. | # | Chantier | Fichiers | Difficulté | Pourquoi ce rang | |---|---|---|---|---| | ~~1~~ | ~~**Jauges DisplayLink**~~ ✅ | 9 | faible | Fait le 7 août — `3f99c87` | -| 2 | **Divers (§3.8)** | 4 | faible | Quatre gains rapides et indépendants | +| ~~2~~ | ~~**Divers (§3.8)**~~ ✅ | 4 | faible | Fait le 7 août | | 3 | **Datagen recettes** | 2 | faible | Peut bloquer la progression du joueur | | 4 | **Worldgen config** | 2 | faible/moy. | Silencieux mais fausse la génération | | 5 | **Compat Alex's Caves** | 2 | faible | Isolé, sans risque | diff --git a/src/generated/resources/.cache/35ba5b194a3aa18fb27424c32b9e16e01b900a51 b/src/generated/resources/.cache/35ba5b194a3aa18fb27424c32b9e16e01b900a51 index 2f73dc6..1b6782c 100644 --- a/src/generated/resources/.cache/35ba5b194a3aa18fb27424c32b9e16e01b900a51 +++ b/src/generated/resources/.cache/35ba5b194a3aa18fb27424c32b9e16e01b900a51 @@ -1,4 +1,4 @@ -// 1.21.1 2026-08-06T18:38:19.1353847 Registrate Provider for createnuclear [Registries, Data Maps, Recipes, Advancements, Loot Tables, Tags (blocks), Tags (enchantments), Tags (items), Tags (fluids), Tags (entity_types), generic_server_provider, Blockstates, Item models, Lang (en_us/en_ud), generic_client_provider] +// 1.21.1 2026-08-07T14:24:39.2517151 Registrate Provider for createnuclear [Registries, Data Maps, Recipes, Advancements, Loot Tables, Tags (blocks), Tags (enchantments), Tags (items), Tags (fluids), Tags (entity_types), generic_server_provider, Blockstates, Item models, Lang (en_us/en_ud), generic_client_provider] 0b2c76c9cff305eacfdfb57c4b703f94ca6dc903 assets/createnuclear/blockstates/autunite.json 5d06bc544bcbeb7443178d66955bb5101cf696da assets/createnuclear/blockstates/autunite_pillar.json 5b375444ac5057e63776f4991589c57824574b4a assets/createnuclear/blockstates/cut_autunite.json @@ -48,8 +48,8 @@ b9c915389ea6cf8338d20c48e908591f8baa2108 assets/createnuclear/blockstates/small_ 643a4d44b491a84d0d26e1a8944dffc40e83ce14 assets/createnuclear/blockstates/thorium_ore.json de2884054a21315d8b167f64b206be331d388420 assets/createnuclear/blockstates/uranium.json 4557f548df100ae1d05e3b5711797225f6a39673 assets/createnuclear/blockstates/uranium_ore.json -c4ffee4fc47828c308cf08b73fafd23154bbb19c assets/createnuclear/lang/en_ud.json -204f1b505e7d29e9fc496c5fe51f90cf4c44472a assets/createnuclear/lang/en_us.json +33e9dcac40fcb32a46343f546f0aad2e38fe96f0 assets/createnuclear/lang/en_ud.json +28e64c6658311d18a29cf635ef2821b03e53f8a7 assets/createnuclear/lang/en_us.json a8495d2cd5e38213683becaf1c84b2852f8b06f5 assets/createnuclear/models/block/autunite_natural_0.json 29394a22ee8655dc22ea51563411505fbcfd2dab assets/createnuclear/models/block/autunite_natural_1.json 9e4f83de1ca7a9ab5363f43fc7c3f7f4ec6164d5 assets/createnuclear/models/block/autunite_natural_2.json diff --git a/src/generated/resources/assets/createnuclear/lang/en_ud.json b/src/generated/resources/assets/createnuclear/lang/en_ud.json index 79b9ce6..6e48f08 100644 --- a/src/generated/resources/assets/createnuclear/lang/en_ud.json +++ b/src/generated/resources/assets/createnuclear/lang/en_ud.json @@ -293,6 +293,7 @@ "createnuclear.tooltip.item.fuel.rod": " :poᴚ ןǝnℲ", "createnuclear.tooltip.item.unknown.rod": " :uʍouʞu∩", "createnuclear.tooltip.proximityRodHeat": "Ὁ ɟᄅ˙% :ʇɐǝH poᴚ ʎʇıɯıxoɹԀ", + "createnuclear.tooltip.ratio": "%d :oıʇɐɹ ɹoɟ ǝnןɐΛ poᴚ", "createnuclear.tooltip.rodTimer": "ʞɔıʇ %d :uoıʇɐɹnᗡ poᴚ", "createnuclear.tooltip.statRod": ":uɹǝʇʇɐԀ ʇɐʇS poᴚ", "createnuclear.tooltip.typeRod": "%s :ǝdʎ⟘ poᴚ", diff --git a/src/generated/resources/assets/createnuclear/lang/en_us.json b/src/generated/resources/assets/createnuclear/lang/en_us.json index 5f6b95a..72adb27 100644 --- a/src/generated/resources/assets/createnuclear/lang/en_us.json +++ b/src/generated/resources/assets/createnuclear/lang/en_us.json @@ -293,6 +293,7 @@ "createnuclear.tooltip.item.fuel.rod": "Fuel Rod: ", "createnuclear.tooltip.item.unknown.rod": "Unknown: ", "createnuclear.tooltip.proximityRodHeat": "Proximity Rod Heat: %.2f Q", + "createnuclear.tooltip.ratio": "Rod Value for ratio: %d", "createnuclear.tooltip.rodTimer": "Rod Duration: %d tick", "createnuclear.tooltip.statRod": "Rod Stat Pattern:", "createnuclear.tooltip.typeRod": "Rod Type: %s", diff --git a/src/main/java/net/nuclearteam/createnuclear/CNBlocks.java b/src/main/java/net/nuclearteam/createnuclear/CNBlocks.java index e651b97..723d3f6 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNBlocks.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNBlocks.java @@ -56,6 +56,7 @@ import net.nuclearteam.createnuclear.content.multiblock.cooler.ReactorCooler; import net.nuclearteam.createnuclear.content.multiblock.reinforced.ReinforcedGlassBlock; import net.nuclearteam.createnuclear.content.uraniumOre.UraniumOreBlock; +import net.nuclearteam.createnuclear.content.uraniumOre.UraniumOreItem; import static com.simibubi.create.api.behaviour.display.DisplaySource.displaySource; import static com.simibubi.create.foundation.data.CreateRegistrate.casingConnectivity; @@ -425,7 +426,7 @@ public class CNBlocks { .pattern("RRR") .pattern("RRR") .save(p, CreateNuclear.asResource("crafting/" + c.getName()))) - .item() + .item((b, p) -> new UraniumOreItem(b, p, 27)) .tag(CNTags.forgeItemTag("storage_blocks/raw_uranium")) .build() .register(); @@ -495,7 +496,7 @@ public class CNBlocks { CNTags.forgeBlockTag("ores/uranium"), CNBlockTags.URANIUM_ORES.tag ) - .item() + .item((b, p) -> new UraniumOreItem(b, p, 3)) .tag(CNItemTags.URANIUM_ORES.tag, CNTags.forgeItemTag("ores/uranium")) .build() @@ -521,7 +522,7 @@ public class CNBlocks { CNTags.forgeBlockTag("ores/uranium"), CNBlockTags.URANIUM_ORES.tag ) - .item() + .item((b, p) -> new UraniumOreItem(b, p, 3)) .tag(CNItemTags.URANIUM_ORES.tag, CNTags.forgeItemTag("ores/uranium")) .build() diff --git a/src/main/java/net/nuclearteam/createnuclear/CNOpenPipeEffectHandlers.java b/src/main/java/net/nuclearteam/createnuclear/CNOpenPipeEffectHandlers.java new file mode 100644 index 0000000..e2bbe87 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/CNOpenPipeEffectHandlers.java @@ -0,0 +1,10 @@ +package net.nuclearteam.createnuclear; + +import com.simibubi.create.api.effect.OpenPipeEffectHandler; +import net.nuclearteam.createnuclear.content.radiation.RadiationEffectHandler; + +public class CNOpenPipeEffectHandlers { + public static void registerDefaults() { + OpenPipeEffectHandler.REGISTRY.register(CNFluids.URANIUM.getSource(), new RadiationEffectHandler()); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java b/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java index 28d867f..35dcd46 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java +++ b/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java @@ -6,6 +6,7 @@ import com.simibubi.create.foundation.data.CreateRegistrate; import com.simibubi.create.foundation.item.ItemDescription; import com.simibubi.create.foundation.item.KineticStats; +import net.nuclearteam.createnuclear.foundation.item.RodsStats; import com.simibubi.create.foundation.item.TooltipModifier; import net.createmod.catnip.lang.FontHelper; import net.minecraft.core.registries.BuiltInRegistries; @@ -50,6 +51,7 @@ public class CreateNuclear { .setTooltipModifierFactory(item -> new ItemDescription.Modifier(item, FontHelper.Palette.STANDARD_CREATE) .andThen(TooltipModifier.mapNull(KineticStats.create(item))) + .andThen(RodsStats.create(item)) ); public CreateNuclear(IEventBus eventBus, ModContainer modContainer) { @@ -104,6 +106,7 @@ public static void onCtor(IEventBus modEventBus, ModContainer modContainer) { public static void init(final FMLCommonSetupEvent event) { CNFluids.registerFluidInteractions(); + CNOpenPipeEffectHandlers.registerDefaults(); // Runs here rather than at mod construction: the item entries it reads (e.g. Create's // CRUSHED_URANIUM) are only bound once the registry events have finished. CNRadiationValues.register(); diff --git a/src/main/java/net/nuclearteam/createnuclear/content/uraniumOre/UraniumOreItem.java b/src/main/java/net/nuclearteam/createnuclear/content/uraniumOre/UraniumOreItem.java new file mode 100644 index 0000000..5169bcb --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/uraniumOre/UraniumOreItem.java @@ -0,0 +1,21 @@ +package net.nuclearteam.createnuclear.content.uraniumOre; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.nuclearteam.createnuclear.api.radiation.IRadiationSource; + +public class UraniumOreItem extends BlockItem implements IRadiationSource { + private final double radiation; + + public UraniumOreItem(Block block, Properties properties, double radiation) { + super(block, properties); + this.radiation = radiation; + } + + @Override + public double getRadiation(ItemStack stack, LivingEntity entity) { + return this.radiation * stack.getCount(); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/events/RodsTooltipHandler.java b/src/main/java/net/nuclearteam/createnuclear/foundation/events/RodsTooltipHandler.java new file mode 100644 index 0000000..426baf0 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/events/RodsTooltipHandler.java @@ -0,0 +1,35 @@ +package net.nuclearteam.createnuclear.foundation.events; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.entity.player.ItemTooltipEvent; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.foundation.item.RodsStats; + +@EventBusSubscriber(modid = CreateNuclear.MOD_ID, value = Dist.CLIENT) +public class RodsTooltipHandler { + @SubscribeEvent + public static void onItemTooltip(ItemTooltipEvent event) { + ItemStack stack = event.getItemStack(); + Item item = stack.getItem(); + Player player = event.getEntity(); + + if (player == null) return; + + ResourceLocation id = BuiltInRegistries.ITEM.getKey(item); + // Mod items already get their rod tooltip via Registrate's setTooltipModifierFactory + // (CreateNuclear.REGISTRATE). This handler only serves EXTERNAL items (other mods or + // datapack-defined RodTypes resolved at runtime via RodType.resolveRodType), which + // setTooltipModifierFactory cannot cover. Do NOT remove/invert: doing so double-tooltips mod rods. + if (id != null && CreateNuclear.MOD_ID.equals(id.getNamespace())) return; + + RodsStats rodsStats = RodsStats.create(item); + rodsStats.modify(event); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/item/RodsStats.java b/src/main/java/net/nuclearteam/createnuclear/foundation/item/RodsStats.java new file mode 100644 index 0000000..d17bf13 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/item/RodsStats.java @@ -0,0 +1,65 @@ +package net.nuclearteam.createnuclear.foundation.item; + +import com.simibubi.create.foundation.item.TooltipModifier; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.CommonComponents; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; +import net.neoforged.neoforge.event.entity.player.ItemTooltipEvent; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; + +import java.util.ArrayList; +import java.util.List; + +public record RodsStats(Item item) implements TooltipModifier { + + public static RodsStats create(Item item) { + return new RodsStats(item); + } + + @Override + public void modify(ItemTooltipEvent context) { + List rodTypesStat = getRodTypeStats(item, context.getEntity()); + if (!rodTypesStat.isEmpty()) { + List tooltip = context.getToolTip(); + tooltip.add(CommonComponents.EMPTY); + tooltip.addAll(rodTypesStat); + } + } + + private static List getRodTypeStats(Item item, Player player) { + Level world = player.level(); + List components = new ArrayList<>(); + + RodType rodType = RodType.resolveRodType(item, world); + + if (rodType.isNotEmptyItem()) { + CreateNuclearLang.translate("tooltip.statRod") + .style(ChatFormatting.GRAY) + .addTo(components); + + CreateNuclearLang.builder() + .add(CreateNuclearLang.translate("tooltip.baseRodHeat", rodType.baseRodHeat().get())) + .addTo(components); + CreateNuclearLang.builder() + .add(CreateNuclearLang.translate("tooltip.proximityRodHeat", rodType.proximityRodHeat().get())) + .addTo(components); + CreateNuclearLang.builder() + .add(CreateNuclearLang.translate("tooltip.rodTimer", rodType.rodTimer().get())) + .addTo(components); + CreateNuclearLang.builder() + .add(CreateNuclearLang.translate("tooltip.ratio", rodType.ratio().get())) + .addTo(components); + CreateNuclearLang.builder() + .add(CreateNuclearLang.translate("tooltip.typeRod", rodType.type().name())) + .style(rodType.type().equals(RodType.TypeRod.FUEL) ? ChatFormatting.GREEN : ChatFormatting.AQUA) + .addTo(components); + } + + return components; + + } +} \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/lang/default/tooltips.json b/src/main/resources/assets/createnuclear/lang/default/tooltips.json index c081563..85fa69a 100644 --- a/src/main/resources/assets/createnuclear/lang/default/tooltips.json +++ b/src/main/resources/assets/createnuclear/lang/default/tooltips.json @@ -54,6 +54,7 @@ "createnuclear.tooltip.baseRodHeat": "Base Rod Heat: %d Q", "createnuclear.tooltip.proximityRodHeat": "Proximity Rod Heat: %.2f Q", "createnuclear.tooltip.rodTimer": "Rod Duration: %d tick", + "createnuclear.tooltip.ratio": "Rod Value for ratio: %d", "createnuclear.tooltip.typeRod": "Rod Type: %s", "createnuclear.tooltip.cloth.color": "Color of armor piece: %s", From b86cbb013f1876ee6097739aa71d28136b853ff5 Mon Sep 17 00:00:00 2001 From: mathi Date: Fri, 7 Aug 2026 15:07:17 +0200 Subject: [PATCH 24/33] docs: pointer les liens de depot vers l'organisation Create-Nuclear-Team Les depots ont ete transferes sous l'organisation Create-Nuclear-Team, mais plusieurs liens pointaient encore sur les comptes personnels d'origine. GitHub redirige, donc rien n'etait casse -- mais une redirection cesse de fonctionner des que quelqu'un recree un depot sous l'ancien nom. Le cas le plus genant n'etait pas le proprietaire mais le depot lui-meme : issueTrackerURL de neoforge.mods.toml pointait sur CreateNuclearForge, pas sur CreateNuclearNeoForge. Les rapports de bug des joueurs NeoForge, ouverts depuis l'ecran de crash du jeu, atterrissaient donc dans le tracker de la version Forge. Corrige en meme temps que le proprietaire. Le README de CreateNuclearForge etait deja correct sur les trois liens : c'est lui qui a servi de reference. Non modifie volontairement : le CHANGELOG (ce sont des liens vers des commits et des PR historiques, les reecrire falsifierait l'historique) et les rapports de crash archives dans run/, qui citent l'URL en vigueur au moment du crash. Co-Authored-By: Claude Opus 5 (1M context) --- README.md | 4 ++-- src/main/resources/META-INF/neoforge.mods.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b06cef0..4d9e131 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,11 @@ If you want to help us with translations, we have opened a Crowdin project. Clic # Source Code ## Fabric -https://github.com/valentinlamine/CreateNuclearFabric +https://github.com/Create-Nuclear-Team/CreateNuclearFabric ## Forge -https://github.com/Giovanniricotta2002/CreateNuclearForge +https://github.com/Create-Nuclear-Team/CreateNuclearForge ## NeoForge diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml index dc88615..eacbed9 100644 --- a/src/main/resources/META-INF/neoforge.mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -1,6 +1,6 @@ modLoader="javafml" #mandatory loaderVersion="${loader_version_range}" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions. -issueTrackerURL="https://github.com/Giovanniricotta2002/CreateNuclearForge/issues" +issueTrackerURL="https://github.com/Create-Nuclear-Team/CreateNuclearNeoForge/issues" license="${mod_license}" From 3b89c0b165a225b3011798aa94566f5dd7546e78 Mon Sep 17 00:00:00 2001 From: mathi Date: Fri, 7 Aug 2026 15:18:00 +0200 Subject: [PATCH 25/33] docs: reduire la roadmap de parite au seul travail restant Le fichier accumulait le fait et le restant : sections barrees, encadres "FAIT le ...", diagnostics d'origine replies dans des
, journal des chantiers. A la lecture, il fallait trier avant de savoir quoi faire. Desormais il ne contient que du travail restant. Ce qui est fait en sort -- l'historique est dans les commits, qui sont plus fiables qu'un journal tenu a la main. Supprime : le journal, la section des 8 fichiers renommes (les noms sont alignes des deux cotes), les chantiers Jauges DisplayLink et Divers, et les lignes barrees de l'ordre de travail. Conserve, mais deplace, ce qui n'etait pas "du travail fait" mais du savoir utile pour la suite : - la lecon des deux chantiers -- une feature peut etre presente mais morte, faute de point d'enregistrement -- passe en encadre du paragraphe 0 et en premiere etape de la methode, avec le grep qui la detecte ; - le fait que trois classes du mod masquent une classe vanilla homonyme (ArmorMaterials, CatLieOnBedGoal, CatSitOnBlockGoal) rejoint les pieges du paragraphe 6 : ce n'est pas une tache faite, c'est une propriete du code actuel qui peut mordre plus tard ; - les deux cas de codec persistant trop strict sont fusionnes en un seul piege, avec les deux exemples. Ajoute un paragraphe 4 "Verifications en jeu en attente" : la radiation et les trois comportements livres au chantier 2 ne sont couverts par aucun gametest. C'est du travail restant, meme si ce n'est pas du portage -- le supprimer avec le reste du chantier l'aurait perdu. Renumerotation en 0-7 sans trou. Les messages de commit anterieurs a celui-ci referencent l'ancienne numerotation (section 1, section 3.1, section 3.8). Verifie : la somme des fichiers des six chantiers fait bien 17, le diff d'arborescence en donne 21 (17 + les 4 a ne pas porter), et aucune reference ne pointe vers une section supprimee. Co-Authored-By: Claude Opus 5 (1M context) --- PARITE_FORGE_NEOFORGE.md | 293 +++++++++++---------------------------- 1 file changed, 80 insertions(+), 213 deletions(-) diff --git a/PARITE_FORGE_NEOFORGE.md b/PARITE_FORGE_NEOFORGE.md index 9770afb..c41b085 100644 --- a/PARITE_FORGE_NEOFORGE.md +++ b/PARITE_FORGE_NEOFORGE.md @@ -3,6 +3,9 @@ Ce document liste tout ce qui sépare encore `CreateNuclearNeoForge` de `CreateNuclearForge` en termes de **features**, et comment porter chaque bloc. +**Ce fichier ne contient que du travail restant.** Ce qui est fait en sort — l'historique +est dans les commits. + État au **7 août 2026**, branche `V2-Reacteur`. Pour le domaine réacteur, déjà porté et validé, voir [`PORTAGE_REACTEUR.md`](PORTAGE_REACTEUR.md). @@ -11,77 +14,28 @@ Pour le domaine réacteur, déjà porté et validé, voir [`PORTAGE_REACTEUR.md` | Fichiers `.java` | 296 | 294 | | Ressources | 1 132 | 1 115 | -### Journal - -| Date | Chantier | Commit | -|---|---|---| -| 7 août | §3.1 Jauges DisplayLink — **fait** | `3f99c87` | -| 7 août | Bug de persistance du contrôleur (hors roadmap, trouvé en chemin) | `a8d1f1b` | -| 7 août | §1 Alignement des 8 noms de fichiers divergents — **fait** | `b5534d2` + `b1ca4644` (Forge) | -| 7 août | §3.8 Divers (4 fichiers) — **fait** | voir §3.8 | - --- ## 0. Comment lire ce document -**Au départ**, un `diff` brut des arborescences donnait **42 fichiers Forge sans équivalent -NeoForge**. Ce chiffre était trompeur : +Un `diff` brut des arborescences donne **21 fichiers Forge sans équivalent NeoForge**. +Ce chiffre est trompeur : -- **8 existaient, sous un autre nom** → §1, **réglé** : les noms sont désormais alignés, ces - fichiers ne polluent plus le diff ; -- **4 sont remplacés par un équivalent 1.21 meilleur** → §2, à ne surtout pas « re-porter » ; -- **30 manquaient réellement** → §3, c'est le vrai travail. +- **4 sont remplacés par un équivalent 1.21 meilleur** → §1, à ne surtout pas « re-porter » ; +- **17 manquent réellement** → §2, c'est le vrai travail. -**Aujourd'hui**, le même `diff` en donne **21**. L'écart avec les 42 du départ se décompose ainsi : -8 renommages (§1) + 9 fichiers portés au chantier 1 (§3.1) + 4 au chantier 2 (§3.8). -Sur ces 21 restants, **4 ne sont pas à porter** (§2) : il reste donc **17 fichiers de vrai travail**. - -S'y ajoutent des écarts *à l'intérieur* de fichiers présents des deux côtés (§4), invisibles +S'y ajoutent des écarts *à l'intérieur* de fichiers présents des deux côtés (§3), invisibles d'un diff d'arborescence — et c'est là qu'ont été trouvés la moitié des bugs du réacteur. ---- - -## 1. ~~Faux positifs — présents, mais renommés~~ ✅ RÉSOLU le 7 août - -**Les 8 noms sont désormais identiques des deux côtés.** Cette section ne décrit plus un écart -à connaître, mais un travail fait — elle est conservée pour l'historique. - -Sept renommages ont eu lieu **côté NeoForge**, pour s'aligner sur Forge (référence) : - -| Avant (NeoForge) | Après (= Forge) | Motif | -|---|---|---| -| `content/rod/CNRodTypes` | `content/multiblock/rod/CNRodTypes` | package différent | -| `foundation/damage**s**Types/` | `foundation/damageTypes/` | le **dossier** seul était fautif — le `package` déclaré dans le fichier était déjà correct, donc dossier et package se contredisaient | -| `CNArmorMaterials` | `ArmorMaterials` | préfixe superflu | -| `infrastructure/config/CExplo**s**e` | `CExplode` | faute de frappe | -| `PlayerInteract**e**ReactorFluidInput` | `PlayerInteractReactorFluidInput` | faute de frappe | -| `IrradiatedCatLieOnBedGoal` | `CatLieOnBedGoal` | préfixe superflu | -| `IrradiatedCatSitOnBlockGoal` | `CatSitOnBlockGoal` | préfixe superflu | - -Le huitième était l'inverse — **la faute était côté Forge**, donc c'est **Forge** qui a été -renommé, pour que les deux convergent vers l'orthographe correcte : - -| Avant (Forge) | Après (= NeoForge) | -|---|---| -| `content/biome/BiomeIrrad**a**tionExtractorItem` | `BiomeIrrad**ia**tionExtractorItem` | - -> ⚠️ **Trois de ces noms masquent volontairement une classe vanilla** : -> `ArmorMaterials` (`net.minecraft.world.item.ArmorMaterials`), `CatLieOnBedGoal` et -> `CatSitOnBlockGoal` (`net.minecraft.world.entity.ai.goal.*`). Les fichiers concernés importent -> le package vanilla en wildcard (`import net.minecraft.world.item.*;`, -> `import net.minecraft.world.entity.ai.goal.*;`) — c'est **sans danger** parce qu'en Java une -> classe du même package l'emporte sur un import à la demande, et qu'aucun de ces fichiers -> n'utilise la classe vanilla homonyme. Forge vit avec cette situation depuis toujours. -> **Mais si un jour l'un de ces fichiers a besoin de la version vanilla, il faudra la qualifier -> complètement** — un `import` simple ne suffira pas. -> -> `BiomeIrradiationExtractorItem.TAG` vaut `"biome_restore"` et l'item est enregistré sous -> `biome_irradiation_extractor` : le renommage Forge **ne touche donc aucune ressource**, ni -> aucun monde existant. +> **Le piège récurrent, vérifié deux fois.** Un fichier absent n'est pas le seul symptôme d'une +> feature manquante. À deux reprises, la classe qui « manquait » n'était qu'un **point +> d'enregistrement** : le reste de la feature existait déjà côté NeoForge, complet et correct, +> mais **n'était référencé nulle part** — donc entièrement mort en jeu. +> **Avant de porter quoi que ce soit, chercher les classes NeoForge jamais référencées.** --- -## 2. Volontairement non portés — l'équivalent 1.21 est meilleur +## 1. Volontairement non portés — l'équivalent 1.21 est meilleur **Ne pas porter ces fichiers.** Les recréer serait une régression. @@ -92,80 +46,15 @@ renommé, pour que les deux convergent vers l'orthographe correcte : | `foundation/advancement/CriterionTriggerBase` | **`SimpleCriterionTrigger` vanilla** — `SimpleCreateNuclearTrigger` en hérite directement | | `foundation/utility/SimplexNoise` | **`net.minecraft.world.level.levelgen.synth.SimplexNoise`** — `Maths` utilise déjà celui de vanilla | -> ⚠️ La radiation mérite quand même une **vérification fonctionnelle** : `RadiationCapability` -> diverge de 186 lignes entre les deux versions. Le mécanisme est correct, mais rien ne dit que -> le comportement (seuils, décroissance, persistance à la mort) est identique. Ce n'est pas un -> portage de fichier, c'est un test en jeu à faire. - --- -## 3. Les 30 fichiers réellement manquants +## 2. Les 17 fichiers réellement manquants Classés par feature, du plus au moins impactant. --- -### 3.1 ~~Jauges DisplayLink du réacteur — 9 fichiers~~ ✅ FAIT le 7 août (`3f99c87`) - -> **Ce que le diagnostic ci-dessous sous-estimait.** La feature n'était pas *incomplète* côté -> NeoForge, elle était **entièrement morte** : `ReactorSummaryDisplaySource` existait mais -> n'était référencée nulle part — ni `CNDisplaySources`, ni le moindre -> `.transform(displaySource(...))` dans `CNBlocks`. Aucune source n'était donc proposée sur un -> Display Link, pas même le résumé. -> -> Deux bugs trouvés au passage dans `ReactorSummaryDisplaySource` : -> - carburant, refroidisseur, fluide et chaleur étaient **commentés** (faute de -> `ReactorGaugeRenderer`), ainsi que les branches « gauge » de `formatValue`/`formatFluid` ; -> - la chaleur était lue via `getConfiguredPattern().get(CUSTOM_DATA).copyTag()` — le piège n°1 -> du §6 — et valait donc **toujours 0**. Remplacé par `getConfiguredPatternHeat()`. -> -> La question du doublon `ReactorGaugeOverrides` est tranchée : **pas de doublon**. C'est un -> générateur de modèle d'item (datagen) pour la jauge du bloc `reactor_frame`, sans rapport avec -> `ReactorGaugeRenderer` qui dessine des barres `█▒` en texte. -> -> Toutes les clés de lang `display_source.*` étaient déjà présentes dans `interface.json`, -> identiques à Forge. Aucune ressource à ajouter. - -
-Diagnostic d'origine - -#### Jauges DisplayLink du réacteur — 9 fichiers ⭐ priorité 1 - -`CNDisplaySources` · `AbstractReactorStatDisplaySource` · `HeatDisplaySource` · -`FuelDisplaySource` · `CoolerDisplaySource` · `LiquidLevelDisplaySource` · -`ReactorSizeDisplaySource` · `ReactorDisplayConstants` · `ReactorGaugeRenderer` - -**Ce qui manque en jeu :** impossible de brancher un Display Link sur une statistique précise -du réacteur. NeoForge n'a que `ReactorSummary` + `ReactorSummaryDisplaySource`, soit un résumé -global — pas la chaleur seule, le carburant seul, le niveau de liquide, ni la taille. - -**Points d'accroche.** Côté Forge, `CNBlocks` attache **six sources** au réacteur, à deux -endroits (le contrôleur et un second bloc, lignes 84-89 et 196-201) : - -```java -.transform(displaySource(CNDisplaySources.HEAT)) -.transform(displaySource(CNDisplaySources.LIQUID_LEVEL)) -.transform(displaySource(CNDisplaySources.FUEL)) -.transform(displaySource(CNDisplaySources.COOLER)) -.transform(displaySource(CNDisplaySources.REACTOR_SIZE)) -.transform(displaySource(CNDisplaySources.REACTOR_SUMMARY)) -``` - -`CNDisplaySources.register()` doit aussi être appelé depuis `CreateNuclear.java`. - -**Difficulté : faible.** Aucun prérequis — le lot 6 a déjà mis en place tout ce dont ces sources -ont besoin : `ReactorDisplayState`, `getMultiblockSize()`, `getInputFluidManager()`, -`getConfiguredPatternHeat()`. C'est de la traduction d'API quasi pure. - -**À savoir :** NeoForge possède en plus un `content/multiblock/frame/ReactorGaugeOverrides` -qui n'existe pas côté Forge — vérifier s'il fait doublon avec `ReactorGaugeRenderer` avant de -porter, pour ne pas se retrouver avec deux systèmes de jauges. - -
- ---- - -### 3.2 Poudre de neige (Snow Powder) — 4 fichiers ⭐ priorité 2 +### 2.1 Poudre de neige (Snow Powder) — 4 fichiers `content/kinetics/fan/processing/SnowPowderRecipe` · `api/data/recipe/SnowPowderRecipeGen` · `foundation/data/recipe/CNSnowPowderRecipeGen` · `compat/jei/category/FanSnowPowderCategory` @@ -184,7 +73,7 @@ recette déjà porté (`CNEnrichedRecipeGen`, `EnrichedRecipeGen`) plutôt que d --- -### 3.3 Vache irradiée + abstraction des animaux — 5 fichiers ⭐ priorité 3 +### 2.2 Vache irradiée + abstraction des animaux — 5 fichiers `IrradiatedCow` · `IrradiatedCowModel` · `IrradiatedCowRenderer` · `IrradiatedAnimal` · `AnimalUtil` @@ -208,7 +97,7 @@ qui fonctionnent aujourd'hui — à faire avec un test en jeu de chaque animal. --- -### 3.4 Worldgen piloté par la config — 2 fichiers +### 2.3 Worldgen piloté par la config — 2 fichiers `infrastructure/worldgen/CNPlacementModifiers` · `infrastructure/worldgen/ConfigPlacementFilter` @@ -217,7 +106,7 @@ Sans lui, **les options de `CWorldGen` ne sont probablement pas respectées** : minerai dans la config n'a aucun effet. **Points d'accroche :** -- `CreateNuclear.java:80` → `CNPlacementModifiers.register(modEventBus)` +- `CreateNuclear.java` → `CNPlacementModifiers.register(modEventBus)` - `CNPlacedFeatures` (lignes 51 et 60 côté Forge) → `ConfigPlacementFilter.INSTANCE` dans la liste des modificateurs de placement @@ -229,7 +118,7 @@ minerai dans la config n'a aucun effet. --- -### 3.5 Datagen de recettes — 2 fichiers +### 2.4 Datagen de recettes — 2 fichiers `foundation/data/recipe/CNDeployingRecipeGen` · `foundation/data/recipe/CNProcessingRecipeGen` @@ -242,7 +131,7 @@ deux versions côte à côte. --- -### 3.6 Compat Alex's Caves — 2 fichiers +### 2.5 Compat Alex's Caves — 2 fichiers `compat/Mods` · `compat/alexscave/AlexscaveCompat` @@ -265,7 +154,7 @@ Côté NeoForge, `NuclearExplosionEntity` n'en a aucune trace. --- -### 3.7 Mixins client — 2 fichiers +### 2.6 Mixins client — 2 fichiers `foundation/mixin/client/CameraAccessor` · `foundation/mixin/client/GameRendererMixin` @@ -281,53 +170,7 @@ avant de porter. --- -### 3.8 ~~Divers — 4 fichiers~~ ✅ FAIT le 7 août - -> **Ce que le diagnostic ci-dessous ratait.** Comme pour les jauges DisplayLink (§3.1), le vrai -> problème n'était pas seulement l'absence de fichiers, mais une feature **entièrement morte** : -> `RadiationEffectHandler` existait déjà côté NeoForge, complet et correct — mais -> `CNOpenPipeEffectHandlers` manquait, donc **il n'était référencé nulle part**. Un tuyau ouvert -> Create crachant de l'uranium n'irradiait donc personne. C'est le deuxième cas identique en deux -> chantiers : **côté NeoForge, chercher systématiquement les classes jamais référencées.** -> -> Deux écarts avec le diagnostic d'origine : -> - **trois** blocs portent `UraniumOreItem` côté Forge, pas deux : `uranium_ore` (3), -> `deepslate_uranium_ore` (3) et surtout `raw_uranium_block` (**27**), qui avait été oublié ; -> - la clé de lang `tooltip.ratio` **manquait** côté NeoForge (les cinq autres clés `tooltip.*` -> des barres étaient déjà là). Sans elle, `RodsStats` aurait affiché la clé brute. - -
-Diagnostic d'origine - -#### Divers — 4 fichiers - -| Fichier | Ce qui manque en jeu | Point d'accroche | -|---|---|---| -| `foundation/item/RodsStats` | tooltip détaillé des barres (chaleur, durée de vie) | `CreateNuclear.java` — chaîné après `KineticStats.create(item)` dans le `TooltipModifier`. NeoForge a `KineticStats` mais **pas** `RodsStats` | -| `foundation/events/RodsTooltipHandler` | idem, côté événement | à brancher sur le bus d'événements | -| `content/uraniumOre/UraniumOreItem` | l'item de minerai d'uranium irradie le joueur qui le porte | `CNBlocks` lignes 378 et 444 côté Forge : `.item((b, p) -> new UraniumOreItem(b, p, 3))`. NeoForge n'utilise ni `UraniumOreItem` ni `RadiationItem` sur ces blocs | -| `CNOpenPipeEffectHandlers` | effets appliqués par les tuyaux ouverts Create | `CreateNuclear.java:105` — `CNOpenPipeEffectHandlers.registerDefaults()` | - -**Difficulté : faible** pour les quatre. Ce sont de bons premiers tickets. - -
- -> ⚠️ **`RodsTooltipHandler` et `RodsStats` ne font pas doublon**, malgré les apparences. -> `RodsStats` est branché sur `setTooltipModifierFactory` de Registrate, qui ne couvre **que les -> items du mod**. `RodsTooltipHandler` écoute l'`ItemTooltipEvent` et sert **uniquement les items -> externes** (autres mods, ou `RodType` définis par datapack et résolus au runtime) — d'où le -> `return` anticipé quand le namespace est `createnuclear`. **Ne pas « simplifier » en supprimant -> l'un des deux ni en inversant la condition : on double le tooltip des barres du mod.** -> Le commentaire est présent dans le fichier des deux côtés. - -**À tester en jeu** (rien de tout cela n'est couvert par les gametests) : -1. tooltip d'une barre d'uranium/graphite → cinq lignes de stats, type en vert (FUEL) ou cyan ; -2. porter du `raw_uranium_block` en inventaire → la radiation monte (27 × la taille du stack) ; -3. tuyau ouvert Create crachant de l'uranium → irradie les entités dans la zone. - ---- - -## 4. Écarts internes aux fichiers partagés — non audités +## 3. Écarts internes aux fichiers partagés — non audités Ces fichiers existent des deux côtés mais divergent fortement. **Un gros diff n'est pas une preuve de feature manquante** : l'API 1.21 en explique une grande part. Aucun n'a été audité @@ -355,19 +198,31 @@ ligne à ligne, contrairement au domaine réacteur. --- +## 4. Vérifications en jeu en attente + +Ce n'est pas du portage, mais c'est du travail restant. **Aucun de ces points n'est couvert par +les gametests.** + +| À vérifier | Attendu | Pourquoi c'est en attente | +|---|---|---| +| Comportement de la radiation | seuils, décroissance, persistance à la mort identiques à Forge | `RadiationCapability` diverge de 186 lignes. Le mécanisme (data attachments) est correct, mais rien ne dit que le comportement l'est | +| Tooltip d'une barre d'uranium/graphite | cinq lignes de stats, type en vert (FUEL) ou cyan | livré sans test en jeu | +| `raw_uranium_block` en inventaire | la radiation monte de 27 par item | livré sans test en jeu | +| Tuyau ouvert Create crachant de l'uranium | irradie les entités de la zone | livré sans test en jeu ; la feature était morte avant, donc jamais observée | + +--- + ## 5. Ordre de travail suggéré | # | Chantier | Fichiers | Difficulté | Pourquoi ce rang | |---|---|---|---|---| -| ~~1~~ | ~~**Jauges DisplayLink**~~ ✅ | 9 | faible | Fait le 7 août — `3f99c87` | -| ~~2~~ | ~~**Divers (§3.8)**~~ ✅ | 4 | faible | Fait le 7 août | -| 3 | **Datagen recettes** | 2 | faible | Peut bloquer la progression du joueur | -| 4 | **Worldgen config** | 2 | faible/moy. | Silencieux mais fausse la génération | -| 5 | **Compat Alex's Caves** | 2 | faible | Isolé, sans risque | -| 6 | **Snow Powder** | 4 | moyenne | Feature complète, API recettes à traduire | -| 7 | **Abstraction animaux + vache** | 5 | moy./élevée | Refactor de 3 entités qui marchent | -| 8 | **Mixins client** | 2 | moyenne | Sensible, à faire avec test visuel | -| 9 | **Audit `CNBlocks` / `CNItems`** | — | continu | À faire au fil des symptômes, pas d'un bloc | +| 1 | **Datagen recettes (§2.4)** | 2 | faible | Peut bloquer la progression du joueur | +| 2 | **Worldgen config (§2.3)** | 2 | faible/moy. | Silencieux mais fausse la génération | +| 3 | **Compat Alex's Caves (§2.5)** | 2 | faible | Isolé, sans risque | +| 4 | **Snow Powder (§2.1)** | 4 | moyenne | Feature complète, API recettes à traduire | +| 5 | **Abstraction animaux + vache (§2.2)** | 5 | moy./élevée | Refactor de 3 entités qui marchent | +| 6 | **Mixins client (§2.6)** | 2 | moyenne | Sensible, à faire avec test visuel | +| 7 | **Audit `CNBlocks` / `CNItems` (§3)** | — | continu | À faire au fil des symptômes, pas d'un bloc | --- @@ -375,15 +230,18 @@ ligne à ligne, contrairement au domaine réacteur. À reprendre pour chaque chantier ci-dessus. -1. **Porter à l'identique par défaut.** Copier le fichier Forge, ne changer que ce que l'API +1. **Chercher d'abord les classes NeoForge jamais référencées.** Voir l'encadré du §0 : deux + features sur deux se sont révélées présentes mais mortes, faute d'un point d'enregistrement. + Un `grep -rl src` qui ne renvoie que le fichier lui-même est un signal fort. +2. **Porter à l'identique par défaut.** Copier le fichier Forge, ne changer que ce que l'API 1.21 impose. Sur le réacteur, ~35 fichiers sur 50 sont restés **identiques à l'octet**. -2. **Vérifier chaque fichier par un `diff`** contre son original Forge, et **justifier chaque +3. **Vérifier chaque fichier par un `diff`** contre son original Forge, et **justifier chaque ligne qui diffère**. C'est ce qui a permis de garder les deux versions synchronisables. -3. **Compiler après chaque lot**, pas à la fin. -4. **Un commit par lot**, poussé avant d'enchaîner. -5. **Documenter toute divergence assumée** dans le commit, pour qu'une future synchro ne la +4. **Compiler après chaque lot**, pas à la fin. +5. **Un commit par lot**, poussé avant d'enchaîner. +6. **Documenter toute divergence assumée** dans le commit, pour qu'une future synchro ne la « corrige » pas par erreur. -6. **Tester en jeu.** Tout le portage du réacteur compilait et passait les gametests avant que +7. **Tester en jeu.** Tout le portage du réacteur compilait et passait les gametests avant que six bugs bien réels ne sortent au premier test manuel. ### Pièges 1.20.1 → 1.21 déjà rencontrés @@ -401,6 +259,7 @@ ligne à ligne, contrairement au domaine réacteur. | `use(...)` → `InteractionResult` | `useItemOn(...)` → `ItemInteractionResult` | | `NetworkHooks.openScreen(player, be, buf)` | `player.openMenu(be, buf)` | | `isPathfindable(state, getter, pos, type)` | `isPathfindable(state, type)` | +| `@Mod.EventBusSubscriber(bus = Bus.FORGE)` | `@EventBusSubscriber` — le bus GAME est le défaut, et l'attribut `bus` est déprécié | | `data//structures/` | `data//structure/` *(singulier)* | | capabilities `getCapability(...)` | `level.getCapability(Capabilities.X.BLOCK, pos, ctx)` | | `ForgeCatnipServices.FLUID_RENDERER` | `CatnipServices.FLUID_RENDERER` — typé ``, **cast requis** | @@ -414,31 +273,36 @@ Ce sont les plus coûteux : le code compile, ne lève rien, et se comporte mal. perdue**. Passer par un composant typé et `stack.set(...)`. 2. **Un codec persistant qui peut refuser une valeur fait planter la sauvegarde du monde**, - pas l'écriture — donc très loin de la cause. `CNDataComponents.HEAT` était déclaré - `ExtraCodecs.POSITIVE_FLOAT`, refusant `0.0`, la valeur normale d'un réacteur à l'arrêt. - **Valider les invariants en amont, pas dans le codec.** - - > **Ce piège a resservi le 7 août** (`a8d1f1b`), sur `PatternData` cette fois : - > `ItemStack.CODEC` **refuse la stack vide**, et un motif de réacteur fait 57 slots qui ne - > sont presque jamais tous remplis. Résultat : dès qu'un blueprint se trouvait dans un - > contrôleur, `ReactorControllerBlockEntity.write` levait à la sauvegarde du chunk et - > Minecraft désactivait silencieusement la persistance du block entity - > (« It will not persist ») — le contrôleur perdait son blueprint à chaque rechargement. - > Même défaut sur le chemin réseau avec `ItemStack.STREAM_CODEC`. - > **Réflexe 1.21 : pour un `ItemStack` qui peut être vide, c'est - > `ItemStack.OPTIONAL_CODEC` / `OPTIONAL_STREAM_CODEC`, jamais les variantes strictes.** - > - > Ce bug ne s'était pas vu aux gametests parce qu'ils **ne rechargent pas le monde** : + pas l'écriture — donc très loin de la cause. **Valider les invariants en amont, pas dans le + codec.** Rencontré deux fois : + - `ExtraCodecs.POSITIVE_FLOAT` sur la chaleur, qui refusait `0.0`, valeur normale d'un + réacteur à l'arrêt ; + - `ItemStack.CODEC` sur un motif de réacteur, qui **refuse la stack vide** alors que le motif + fait 57 slots presque jamais tous remplis. **Réflexe 1.21 : pour un `ItemStack` qui peut + être vide, c'est `ItemStack.OPTIONAL_CODEC` / `OPTIONAL_STREAM_CODEC`, jamais les variantes + strictes.** + + > Ce second cas ne s'était pas vu aux gametests parce qu'ils **ne rechargent pas le monde** : > l'erreur ne sortait que dans le log de `runGameTestServer`, à l'arrêt du serveur, pendant - > que « All 29 required tests passed » s'affichait juste au-dessus. **Lire le log, pas - > seulement le verdict.** + > que « All tests passed » s'affichait juste au-dessus. **Lire le log, pas seulement le + > verdict.** + +### Noms qui masquent une classe vanilla + +Trois classes du mod portent volontairement le nom d'une classe vanilla, pour rester alignées +sur Forge : `ArmorMaterials` (`net.minecraft.world.item.ArmorMaterials`), `CatLieOnBedGoal` et +`CatSitOnBlockGoal` (`net.minecraft.world.entity.ai.goal.*`). Les fichiers concernés importent +le package vanilla en wildcard — **sans danger**, parce qu'en Java une classe du même package +l'emporte sur un import à la demande, et qu'aucun de ces fichiers n'utilise la classe vanilla +homonyme. **Mais si l'un d'eux a un jour besoin de la version vanilla, il faudra la qualifier +complètement** — un `import` simple ne suffira pas. --- ## 7. Vérifier l'état à tout moment ```bash -# Fichiers Forge sans équivalent NeoForge (attention aux 8 renommés de §1) +# Fichiers Forge sans équivalent NeoForge — doit en lister 21 cd ~/Documents/Ynov/Ydays diff <(cd CreateNuclearForge/src && find . -name '*.java' | sort) \ <(cd CreateNuclearNeoForge/src && find . -name '*.java' | sort) @@ -447,6 +311,9 @@ diff <(cd CreateNuclearForge/src && find . -name '*.java' | sort) \ diff CreateNuclearForge/src/main/java/.../X.java \ CreateNuclearNeoForge/src/main/java/.../X.java +# Classes NeoForge jamais référencées (le piège du §0) +cd CreateNuclearNeoForge && grep -rl '' src --include=*.java + # Non-régression du réacteur — doit sortir en 0 des deux côtés cd CreateNuclearNeoForge && ./gradlew runGameTestServer # 31 tests cd CreateNuclearForge && ./gradlew runGameTestServer # 28 tests From 7a1f4a02fbeb4eaeaa2a956f6720ddf9df2f18b3 Mon Sep 17 00:00:00 2001 From: mathi Date: Fri, 7 Aug 2026 18:03:28 +0200 Subject: [PATCH 26/33] feat(snow_powder): add snow powder processing and related recipes --- PARITE_FORGE_NEOFORGE.md | 160 ++++++++++-------- run/command_history.txt | 3 + run/server.properties | 2 +- ... 15812fa7bc190aa8f0a8644088c7ff563925e506} | 9 +- .../35ba5b194a3aa18fb27424c32b9e16e01b900a51 | 3 +- .../9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e | 6 +- .../fed443662143001aeb5341375f6f5ef31d10baea | 12 +- ..._concentrate_for_nitrogen_concentrate.json | 32 ++++ ..._concentrate_for_nitrogen_concentrate.json | 32 ++++ ..._concentrate_for_nitrogen_concentrate.json | 13 ++ ...ut_from_fluid_pipe_and_reactor_casing.json | 16 ++ ..._output_from_shaft_and_reactor_casing.json | 2 +- ...input_from_hopper_and_reactor_casing.json} | 2 +- .../recipe/mixing/liquid_nitrogen.json | 18 ++ ..._concentrate_for_nitrogen_concentrate.json | 13 ++ .../cooled_nitrogen_concentrate.json | 13 ++ .../fan_processing_catalysts/snow_powder.json | 5 + .../worldgen/placed_feature/lead_ore.json | 2 +- .../worldgen/placed_feature/nitrate_ore.json | 2 +- .../striated_ores_overworld.json | 2 +- .../worldgen/placed_feature/thorium_ore.json | 2 +- .../worldgen/placed_feature/uranium_ore.json | 2 +- .../createnuclear/CNRecipeTypes.java | 4 +- .../net/nuclearteam/createnuclear/CNTags.java | 1 + .../createnuclear/CreateNuclear.java | 2 + .../compat/jei/CreateNuclearJEI.java | 11 +- .../jei/category/FanSnowPowderCategory.java | 40 +++++ .../fan/processing/CNFanProcessingTypes.java | 59 +++++++ .../fan/processing/SnowPowderRecipe.java | 36 ++++ .../data/recipe/CNDeployingRecipeGen.java | 55 ++++++ .../recipe/CNItemApplicationRecipeGen.java | 12 -- .../data/recipe/CNMixingRecipeGen.java | 8 + .../data/recipe/CNRecipeProvider.java | 4 +- .../data/recipe/CNSnowPowderRecipeGen.java | 20 +++ .../data/recipe/CNStandardRecipeGen.java | 3 +- .../data/recipe/SnowPowderRecipeGen.java | 43 +++++ .../infrastructure/config/CWorldGen.java | 6 +- .../data/CreateNuclearRegistrateTags.java | 5 + .../worldgen/CNPlacedFeatures.java | 1 - .../worldgen/CNPlacementModifiers.java | 18 ++ .../worldgen/ConfigPlacementFilter.java | 24 +++ .../block/reactor/casing/casing_inner.png | Bin 514 -> 0 bytes .../block/reactor/casing/casing_top.png | Bin 491 -> 0 bytes .../casing/reactor_casing_connected.png | Bin 10796 -> 10532 bytes .../reactor/controller/controller_panel.png | Bin 514 -> 0 bytes 45 files changed, 593 insertions(+), 110 deletions(-) rename src/generated/resources/.cache/{b256105d8411632b0d585496ea8944a751a08034 => 15812fa7bc190aa8f0a8644088c7ff563925e506} (71%) create mode 100644 src/generated/resources/data/createnuclear/advancement/recipes/misc/blasting/nitrogen_concentrate_for_nitrogen_concentrate.json create mode 100644 src/generated/resources/data/createnuclear/advancement/recipes/misc/smelting/nitrogen_concentrate_for_nitrogen_concentrate.json create mode 100644 src/generated/resources/data/createnuclear/recipe/blasting/nitrogen_concentrate_for_nitrogen_concentrate.json create mode 100644 src/generated/resources/data/createnuclear/recipe/deploying/reactor_fluid_input_from_fluid_pipe_and_reactor_casing.json rename src/generated/resources/data/createnuclear/recipe/{item_application => deploying}/reactor_output_from_shaft_and_reactor_casing.json (84%) rename src/generated/resources/data/createnuclear/recipe/{item_application/reactor_input_from_hopper_and_reactor_casing.json => deploying/reactor_rod_input_from_hopper_and_reactor_casing.json} (84%) create mode 100644 src/generated/resources/data/createnuclear/recipe/mixing/liquid_nitrogen.json create mode 100644 src/generated/resources/data/createnuclear/recipe/smelting/nitrogen_concentrate_for_nitrogen_concentrate.json create mode 100644 src/generated/resources/data/createnuclear/recipe/snow_powder/cooled_nitrogen_concentrate.json create mode 100644 src/generated/resources/data/createnuclear/tags/block/fan_processing_catalysts/snow_powder.json create mode 100644 src/main/java/net/nuclearteam/createnuclear/compat/jei/category/FanSnowPowderCategory.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/content/kinetics/fan/processing/SnowPowderRecipe.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNDeployingRecipeGen.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNSnowPowderRecipeGen.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/SnowPowderRecipeGen.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNPlacementModifiers.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/ConfigPlacementFilter.java delete mode 100644 src/main/resources/assets/createnuclear/textures/block/reactor/casing/casing_inner.png delete mode 100644 src/main/resources/assets/createnuclear/textures/block/reactor/casing/casing_top.png delete mode 100644 src/main/resources/assets/createnuclear/textures/block/reactor/controller/controller_panel.png diff --git a/PARITE_FORGE_NEOFORGE.md b/PARITE_FORGE_NEOFORGE.md index c41b085..bd6a6cd 100644 --- a/PARITE_FORGE_NEOFORGE.md +++ b/PARITE_FORGE_NEOFORGE.md @@ -6,23 +6,25 @@ en termes de **features**, et comment porter chaque bloc. **Ce fichier ne contient que du travail restant.** Ce qui est fait en sort — l'historique est dans les commits. -État au **7 août 2026**, branche `V2-Reacteur`. +État au **7 août 2026**, branche `V2-Reacteur`, après le portage de la poudre de neige, du +worldgen piloté par la config et du datagen de recettes. Pour le domaine réacteur, déjà porté et validé, voir [`PORTAGE_REACTEUR.md`](PORTAGE_REACTEUR.md). | | Forge | NeoForge | |---|---|---| -| Fichiers `.java` | 296 | 294 | -| Ressources | 1 132 | 1 115 | +| Fichiers `.java` | 296 | 301 | +| Ressources | 1 132 | 1 118 | --- ## 0. Comment lire ce document -Un `diff` brut des arborescences donne **21 fichiers Forge sans équivalent NeoForge**. +Un `diff` brut des arborescences donne **15 fichiers Forge sans équivalent NeoForge**. Ce chiffre est trompeur : -- **4 sont remplacés par un équivalent 1.21 meilleur** → §1, à ne surtout pas « re-porter » ; -- **17 manquent réellement** → §2, c'est le vrai travail. +- **4 sont remplacés par un équivalent 1.21 meilleur** → §1.1, à ne surtout pas « re-porter » ; +- **2 existent sous un autre nom ou dans un autre package** → §1.2, idem ; +- **9 manquent réellement** → §2, c'est le vrai travail. S'y ajoutent des écarts *à l'intérieur* de fichiers présents des deux côtés (§3), invisibles d'un diff d'arborescence — et c'est là qu'ont été trouvés la moitié des bugs du réacteur. @@ -35,9 +37,11 @@ d'un diff d'arborescence — et c'est là qu'ont été trouvés la moitié des b --- -## 1. Volontairement non portés — l'équivalent 1.21 est meilleur +## 1. À ne pas porter — l'équivalent existe déjà -**Ne pas porter ces fichiers.** Les recréer serait une régression. +**Ne pas recréer ces fichiers.** Le `diff` d'arborescence du §7 les listera toujours. + +### 1.1 Volontairement non portés — l'équivalent 1.21 est meilleur | Fichier Forge | Remplacé côté NeoForge par | |---|---| @@ -46,34 +50,27 @@ d'un diff d'arborescence — et c'est là qu'ont été trouvés la moitié des b | `foundation/advancement/CriterionTriggerBase` | **`SimpleCriterionTrigger` vanilla** — `SimpleCreateNuclearTrigger` en hérite directement | | `foundation/utility/SimplexNoise` | **`net.minecraft.world.level.levelgen.synth.SimplexNoise`** — `Maths` utilise déjà celui de vanilla | ---- +### 1.2 Présents sous un autre nom ou dans un autre package -## 2. Les 17 fichiers réellement manquants +| Fichier Forge | Équivalent NeoForge | Pourquoi | +|---|---|---| +| `foundation/data/recipe/CNProcessingRecipeGen` | `foundation/data/recipe/CNRecipeProvider` | En 1.21 la classe n'hérite plus de `ProcessingRecipeGen` mais de `RecipeProvider`, et agrège les générateurs. Même rôle, nom aligné sur son parent | +| `api/data/recipe/SnowPowderRecipeGen` | `foundation/data/recipe/SnowPowderRecipeGen` | Suit `EnrichedRecipeGen`, qui vit dans `foundation` côté NeoForge parce qu'il hérite de `StandardProcessingRecipeGen` (introduit en 1.21) | -Classés par feature, du plus au moins impactant. +> ⚠️ `api/data/recipe/EnrichedRecipeGen` existe encore côté NeoForge mais **n'est référencé +> nulle part** — c'est un vestige de la première tentative de portage, avant +> `StandardProcessingRecipeGen`. Le vivant est celui de `foundation`. Ne pas le prendre pour +> modèle, et le supprimer à l'occasion. --- -### 2.1 Poudre de neige (Snow Powder) — 4 fichiers - -`content/kinetics/fan/processing/SnowPowderRecipe` · `api/data/recipe/SnowPowderRecipeGen` · -`foundation/data/recipe/CNSnowPowderRecipeGen` · `compat/jei/category/FanSnowPowderCategory` +## 2. Les 9 fichiers réellement manquants -**Ce qui manque en jeu :** un type de recette de ventilateur entier, avec sa catégorie JEI. -Aucune trace côté NeoForge — `CNRecipeTypes` n'a pas d'entrée `SNOW_POWDER`. - -**Points d'accroche :** -- `CNRecipeTypes` — ajouter `SNOW_POWDER(SnowPowderRecipe::new)` -- `CreateNuclearJEI` — enregistrer la catégorie (`builder(SnowPowderRecipe.class)`) -- le datagen `CNSnowPowderRecipeGen` doit être branché au provider de recettes -- vérifier les ressources associées (textures/lang de la catégorie JEI) - -**Difficulté : moyenne.** L'API des recettes Create a changé en 1.21 ; s'inspirer d'un type de -recette déjà porté (`CNEnrichedRecipeGen`, `EnrichedRecipeGen`) plutôt que de traduire à l'aveugle. +Classés par feature, du plus au moins impactant. --- -### 2.2 Vache irradiée + abstraction des animaux — 5 fichiers +### 2.1 Vache irradiée + abstraction des animaux — 5 fichiers `IrradiatedCow` · `IrradiatedCowModel` · `IrradiatedCowRenderer` · `IrradiatedAnimal` · `AnimalUtil` @@ -97,41 +94,7 @@ qui fonctionnent aujourd'hui — à faire avec un test en jeu de chaque animal. --- -### 2.3 Worldgen piloté par la config — 2 fichiers - -`infrastructure/worldgen/CNPlacementModifiers` · `infrastructure/worldgen/ConfigPlacementFilter` - -**Ce qui manque en jeu :** un filtre de placement qui lit la config avant de générer un minerai. -Sans lui, **les options de `CWorldGen` ne sont probablement pas respectées** : désactiver un -minerai dans la config n'a aucun effet. - -**Points d'accroche :** -- `CreateNuclear.java` → `CNPlacementModifiers.register(modEventBus)` -- `CNPlacedFeatures` (lignes 51 et 60 côté Forge) → `ConfigPlacementFilter.INSTANCE` dans la - liste des modificateurs de placement - -**Difficulté : faible à moyenne.** Le `PlacementModifierType` se déclare de la même façon en -1.21, mais l'enregistrement passe par un `DeferredRegister` NeoForge. - -⚠️ **À vérifier avant de porter** : NeoForge n'a peut-être aucun filtre, ou en a un autre. Un -`runData` sera nécessaire, et les features placées changeront — donc **monde de test neuf**. - ---- - -### 2.4 Datagen de recettes — 2 fichiers - -`foundation/data/recipe/CNDeployingRecipeGen` · `foundation/data/recipe/CNProcessingRecipeGen` - -**Ce qui manque en jeu :** des recettes qui existent côté Forge et pas côté NeoForge — -déployeur, et une base commune de recettes de traitement. - -**Difficulté : faible**, mais **impact direct sur la progression du joueur** : des objets -peuvent être tout simplement non craftables. À vérifier en jeu, JEI en main, en comparant les -deux versions côte à côte. - ---- - -### 2.5 Compat Alex's Caves — 2 fichiers +### 2.2 Compat Alex's Caves — 2 fichiers `compat/Mods` · `compat/alexscave/AlexscaveCompat` @@ -154,7 +117,7 @@ Côté NeoForge, `NuclearExplosionEntity` n'en a aucune trace. --- -### 2.6 Mixins client — 2 fichiers +### 2.3 Mixins client — 2 fichiers `foundation/mixin/client/CameraAccessor` · `foundation/mixin/client/GameRendererMixin` @@ -196,6 +159,41 @@ ligne à ligne, contrairement au domaine réacteur. > **Méthode qui a marché :** ne pas lire le diff en entier, mais partir d'un symptôme observé en > jeu et remonter. C'est plus rapide et ça ne trouve que des bugs réels. +### 3.1 Recettes — diff des JSON générés + +Le diff des `.java` cache mal les recettes manquantes ; celui des JSON générés les montre +directement. Commande dans le §7. + +**Corrigé** (symptôme signalé : le concentré d'azote refroidi ne servait à rien) — toute la +chaîne de l'azote était morte, **cassée aux deux bouts** : + +| Étape | Recette | État avant | +|---|---|---| +| nitrate → concentré d'azote | `smelting` + `blasting` | absente de `CNStandardRecipeGen` | +| concentré → concentré refroidi | `snow_powder` | absente — c'est le §2.1, porté depuis | +| concentré refroidi + glace → azote liquide | `mixing` | absente de `CNMixingRecipeGen` | + +Seul le fluide `LIQUID_NITROGEN` était enregistré — donc obtenable uniquement en créatif. + +**Reste à traiter :** + +| Recette Forge | Absente côté NeoForge | +|---|---| +| `mixing/thorium_fluid` | oui — `CNFluids.THORIUM` est enregistré mais inobtenable, même schéma que l'azote | +| `crafting/thorium_block_from_compacting` · `crafting/thorium_ingot_from_compacting` | oui — `THORIUM_COMPACTING` manque dans `CNStandardRecipeGen` | +| `mechanical_crafting/reactor_alarm` | oui | + +> ⚠️ **Sept recettes partent dans le namespace `create`.** `CNCrushingRecipeGen` (6) et +> `CNWashingRecipeGen` (1) utilisent `create(() -> ingrédient, …)`. En 1.21 cette surcharge +> **prend `Create.ID` comme namespace par défaut**, plus celui du générateur — les JSON +> atterrissent dans `src/generated/resources/data/create/recipe/`. Ce n'est pas un manque : les +> recettes se chargent, mais sous l'id de Create, et **écrasent celles de Create** là où les ids +> coïncident (`crushing/raw_copper`, `crushing/raw_zinc`, `crushing/raw_uranium_block`, +> `splashing/crushed_raw_lead` existent dans le jar de Create). Forge n'a pas le problème : +> l'ancienne surcharge prenait le namespace du générateur. +> **Correctif : `create(CreateNuclear.MOD_ID, () -> ingrédient, …)`.** À faire avec un test JEI, +> les ids de recette changent. + --- ## 4. Vérifications en jeu en attente @@ -209,6 +207,15 @@ les gametests.** | Tooltip d'une barre d'uranium/graphite | cinq lignes de stats, type en vert (FUEL) ou cyan | livré sans test en jeu | | `raw_uranium_block` en inventaire | la radiation monte de 27 par item | livré sans test en jeu | | Tuyau ouvert Create crachant de l'uranium | irradie les entités de la zone | livré sans test en jeu ; la feature était morte avant, donc jamais observée | +| Ventilateur derrière de la neige poudreuse | le concentré d'azote devient du concentré d'azote refroidi ; particules flocon/éternuement ; entités ralenties | §2.1 porté sans test en jeu. Vérifier aussi la catégorie JEI « Cryogenic fan » | +| `enable_world_gen = false` dans la config commune | **monde neuf** sans uranium, plomb, thorium, nitrate ni strates | filtre de placement porté sans test en jeu. Ne se voit que sur un monde généré après coup | +| `enable_world_gen = true` (défaut) | les cinq features génèrent comme avant | le filtre est désormais `createnuclear:config_filter`, plus celui de Create — non-régression à confirmer | +| Chaîne de l'azote de bout en bout | nitrate → *(four)* → concentré → *(ventilateur + neige poudreuse)* → concentré refroidi → *(mixeur + glace)* → 100 mB d'azote liquide | §3.1 corrigé sans test en jeu | + +> **Divergence assumée sur la clé de config.** `CWorldGen` exposait `disableWorldGen` (défaut +> `false`) — un copier-coller littéral de la classe homonyme de Create, **jamais lu par personne**. +> Il est remplacé par `enable_world_gen` (défaut `true`), la clé de Forge. Un `createnuclear-common.toml` +> existant perdra donc son ancienne entrée : sans effet, puisqu'elle n'en avait aucun. --- @@ -216,13 +223,13 @@ les gametests.** | # | Chantier | Fichiers | Difficulté | Pourquoi ce rang | |---|---|---|---|---| -| 1 | **Datagen recettes (§2.4)** | 2 | faible | Peut bloquer la progression du joueur | -| 2 | **Worldgen config (§2.3)** | 2 | faible/moy. | Silencieux mais fausse la génération | -| 3 | **Compat Alex's Caves (§2.5)** | 2 | faible | Isolé, sans risque | -| 4 | **Snow Powder (§2.1)** | 4 | moyenne | Feature complète, API recettes à traduire | -| 5 | **Abstraction animaux + vache (§2.2)** | 5 | moy./élevée | Refactor de 3 entités qui marchent | -| 6 | **Mixins client (§2.6)** | 2 | moyenne | Sensible, à faire avec test visuel | -| 7 | **Audit `CNBlocks` / `CNItems` (§3)** | — | continu | À faire au fil des symptômes, pas d'un bloc | +| 1 | **Compat Alex's Caves (§2.2)** | 2 | faible | Isolé, sans risque | +| 2 | **Abstraction animaux + vache (§2.1)** | 5 | moy./élevée | Refactor de 3 entités qui marchent | +| 3 | **Mixins client (§2.3)** | 2 | moyenne | Sensible, à faire avec test visuel | +| 4 | **Audit `CNBlocks` / `CNItems` (§3)** | — | continu | À faire au fil des symptômes, pas d'un bloc | + +Les tests en jeu du §4 passent avant tout ça : trois chantiers viennent d'être livrés sans être +observés une seule fois en jeu. --- @@ -263,6 +270,9 @@ les gametests.** | `data//structures/` | `data//structure/` *(singulier)* | | capabilities `getCapability(...)` | `level.getCapability(Capabilities.X.BLOCK, pos, ctx)` | | `ForgeCatnipServices.FLUID_RENDERER` | `CatnipServices.FLUID_RENDERER` — typé ``, **cast requis** | +| `ProcessingRecipe` + `RecipeWrapper`/`ItemStackHandler` | `StandardProcessingRecipe` — plus de classe wrapper à écrire, `new SingleRecipeInput(stack)` suffit | +| `Codec.unit(...)` pour un `PlacementModifierType` | `MapCodec.unit(...)` — `PlacementModifierType#codec()` renvoie un `MapCodec` | +| `CatnipServices.REGISTRIES.getKeyOrThrow(...)` | `RegisteredObjectsHelper.getKeyOrThrow(...)` | ### Deux pièges qui ne cassent pas la compilation @@ -302,11 +312,19 @@ complètement** — un `import` simple ne suffira pas. ## 7. Vérifier l'état à tout moment ```bash -# Fichiers Forge sans équivalent NeoForge — doit en lister 21 +# Fichiers Forge sans équivalent NeoForge — doit en lister 15 (4 du §1.1, 2 du §1.2, 9 du §2) cd ~/Documents/Ynov/Ydays diff <(cd CreateNuclearForge/src && find . -name '*.java' | sort) \ <(cd CreateNuclearNeoForge/src && find . -name '*.java' | sort) +# Recettes présentes côté Forge et absentes côté NeoForge (§3.1) +# Les préfixes diffèrent : `recipes/` en 1.20.1, `recipe/` en 1.21 +diff <(cd CreateNuclearForge/src/generated/resources/data/createnuclear/recipes && find . -name '*.json' | sort) \ + <(cd CreateNuclearNeoForge/src/generated/resources/data/createnuclear/recipe && find . -name '*.json' | sort) + +# Recettes qui fuient dans le namespace de Create — doit être vide hors tags +find CreateNuclearNeoForge/src/generated/resources/data/create -name '*.json' + # Écart interne d'un fichier partagé diff CreateNuclearForge/src/main/java/.../X.java \ CreateNuclearNeoForge/src/main/java/.../X.java diff --git a/run/command_history.txt b/run/command_history.txt index d5dc2d7..79227d8 100644 --- a/run/command_history.txt +++ b/run/command_history.txt @@ -29,3 +29,6 @@ /fillbiome ~-10 ~ ~-10 ~10 ~32 ~10 createnuclear:irradiated_land /gamemode survival /fillbiome ~-10 ~ ~-10 ~10 ~32 ~10 createnuclear:irradiated_land +/time set day +/gamemode spectator +/gamemode creative diff --git a/run/server.properties b/run/server.properties index 5a07c65..a1d1855 100644 --- a/run/server.properties +++ b/run/server.properties @@ -1,5 +1,5 @@ #Minecraft server properties -#Wed Oct 15 10:23:51 CEST 2025 +#Fri Aug 07 17:41:43 CEST 2026 accepts-transfers=false allow-flight=false allow-nether=true diff --git a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 b/src/generated/resources/.cache/15812fa7bc190aa8f0a8644088c7ff563925e506 similarity index 71% rename from src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 rename to src/generated/resources/.cache/15812fa7bc190aa8f0a8644088c7ff563925e506 index 089aaff..af79f6e 100644 --- a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 +++ b/src/generated/resources/.cache/15812fa7bc190aa8f0a8644088c7ff563925e506 @@ -1,17 +1,20 @@ -// 1.21.1 2026-08-04T14:18:44.8746949 Create's Processing Recipes +// 1.21.1 2026-08-07T17:41:15.0471152 CreateNuclear's Processing Recipes dda7e53d7d3c598bf66ec80b0b16f3c21ee18951 data/createnuclear/recipe/compacting/thorium_fluid_to_thorium_ingot.json d85b9bde5850d362e8e708e56c0d082f0fc3303f data/createnuclear/recipe/compacting/uranium_fluid_to_yellowcake.json a11a9d69b96e4cd1b748cab33dabd6a2964ad6ac data/createnuclear/recipe/crushing/coal.json 49a7aa4b43af0c778821d656ec594f80c362fab5 data/createnuclear/recipe/crushing/crushed_raw_uranium.json 2fbb42160178800bdce2bb0c4d5af85313475b26 data/createnuclear/recipe/crushing/nitrate.json +f972ded24a5cf2597fa14c4f604743d7e97d23e6 data/createnuclear/recipe/deploying/reactor_fluid_input_from_fluid_pipe_and_reactor_casing.json +f02f00a8c9503a8fdb2472064a279c98db670be7 data/createnuclear/recipe/deploying/reactor_output_from_shaft_and_reactor_casing.json +8401cab3f92d2465b26fe942969e6eb3afd2d551 data/createnuclear/recipe/deploying/reactor_rod_input_from_hopper_and_reactor_casing.json 371ca9bbe8682870942f1b41ec361b8a51be2f44 data/createnuclear/recipe/enriched/enriched_yellowcake.json fdf6d4fce42373c414542289a73f0e206ff438f2 data/createnuclear/recipe/enriched/enriching_campfire.json 0c8d7d7eae585213bb7b3bb8ca4749dabafc27a3 data/createnuclear/recipe/item_application/reactor_casing_from_steel_and_brass_casing.json -0fcfc5ad2396bb96a254b048f5b7103e6f28c4aa data/createnuclear/recipe/item_application/reactor_input_from_hopper_and_reactor_casing.json -be6e4c7d7a82de8b5398ec0e7b0b193568946f05 data/createnuclear/recipe/item_application/reactor_output_from_shaft_and_reactor_casing.json +c077c12bec6544815c584cd6aee851c892d43347 data/createnuclear/recipe/mixing/liquid_nitrogen.json 93bc6d7a40f2ccb89d8d5703c4b0f6c576d5caf8 data/createnuclear/recipe/mixing/steel.json e52ccded5e0955ab39320129fce8f78d50f52250 data/createnuclear/recipe/mixing/uranium_fluid.json 4e362c3fb35c7a4cf946fda91958fe6b84a59e04 data/createnuclear/recipe/pressing/graphene.json +0883773497d77efae10821cad8506662f7331e09 data/createnuclear/recipe/snow_powder/cooled_nitrogen_concentrate.json c1e0e107502e875ee5befc176335cbd1cef7e04d data/create/recipe/crushing/granite.json 724e99e5db2392644021999b8a694a9b20d8ea0e data/create/recipe/crushing/raw_copper.json ede5a70a121245622455815c9ebba7a22e569b55 data/create/recipe/crushing/raw_thorium.json diff --git a/src/generated/resources/.cache/35ba5b194a3aa18fb27424c32b9e16e01b900a51 b/src/generated/resources/.cache/35ba5b194a3aa18fb27424c32b9e16e01b900a51 index 1b6782c..0be618d 100644 --- a/src/generated/resources/.cache/35ba5b194a3aa18fb27424c32b9e16e01b900a51 +++ b/src/generated/resources/.cache/35ba5b194a3aa18fb27424c32b9e16e01b900a51 @@ -1,4 +1,4 @@ -// 1.21.1 2026-08-07T14:24:39.2517151 Registrate Provider for createnuclear [Registries, Data Maps, Recipes, Advancements, Loot Tables, Tags (blocks), Tags (enchantments), Tags (items), Tags (fluids), Tags (entity_types), generic_server_provider, Blockstates, Item models, Lang (en_us/en_ud), generic_client_provider] +// 1.21.1 2026-08-07T17:41:15.0506966 Registrate Provider for createnuclear [Registries, Data Maps, Recipes, Advancements, Loot Tables, Tags (blocks), Tags (enchantments), Tags (items), Tags (fluids), Tags (entity_types), generic_server_provider, Blockstates, Item models, Lang (en_us/en_ud), generic_client_provider] 0b2c76c9cff305eacfdfb57c4b703f94ca6dc903 assets/createnuclear/blockstates/autunite.json 5d06bc544bcbeb7443178d66955bb5101cf696da assets/createnuclear/blockstates/autunite_pillar.json 5b375444ac5057e63776f4991589c57824574b4a assets/createnuclear/blockstates/cut_autunite.json @@ -607,6 +607,7 @@ fdace7ee58d9860d4549876326a44645f9df2a10 data/createnuclear/recipe/smithing/defa 15960ecb10eeaba53bc6fe3dcc382853c5795256 data/createnuclear/recipe/smithing/default_anti_radiation_leggings_yellow.json a7d4278d8a39649c8b658ad2f3f1d092cb012bdf data/createnuclear/tags/block/enriching_fire_base_blocks.json 509b5baa813ae0dc3345fd97754e4088132359ec data/createnuclear/tags/block/fan_processing_catalysts/enriched.json +bc8701774f57ab000a8f0f1d390702175a6cdbb8 data/createnuclear/tags/block/fan_processing_catalysts/snow_powder.json 925cb97bc13b3122fe17e59ff3ec2fe4d1eaacd5 data/createnuclear/tags/block/lead_ores.json baae2dfd7e19770072d6261ec68ce157a32be80c data/createnuclear/tags/block/thorium_ores.json bad88bea18fec41c7ad6fa4d396feacc0346a137 data/createnuclear/tags/block/uranium_ores.json diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e index b90e23b..de653d5 100644 --- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e +++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e @@ -1,7 +1,8 @@ -// 1.21.1 2025-11-11T13:47:08.3478244 Recipes +// 1.21.1 2026-08-07T17:41:15.0625726 Recipes 817eb6c9cc23cc6579dfe3793a9b4c82917d0dea data/createnuclear/advancement/recipes/misc/blasting/lead_ingot_for_lead.json 9bdc07b5aa3b5309fd0023b267e4a861adc0f1b3 data/createnuclear/advancement/recipes/misc/blasting/lead_ingot_for_lead_ore.json 531e75db303ab55e6fee923af2088a7fd1ee3123 data/createnuclear/advancement/recipes/misc/blasting/lead_ingot_for_raw_lead.json +f22e3f793d8adb3916bd4c2aa64c63f11c8bb74e data/createnuclear/advancement/recipes/misc/blasting/nitrogen_concentrate_for_nitrogen_concentrate.json 010aef79a85e1e86d5f0ca20f3bc9673c520425a data/createnuclear/advancement/recipes/misc/blasting/raw_uranium_for_uranium_ore.json 2d5a511ce08e8868caef61b8ccba1d47e8c2e8b8 data/createnuclear/advancement/recipes/misc/crafting/crafting/lead_block_from_compacting.json f63c279b2fdac7e2661280105d5a3840c1885b5c data/createnuclear/advancement/recipes/misc/crafting/crafting/lead_ingot_from_compacting.json @@ -16,10 +17,12 @@ c72b09dcbf03429201f475fc848debdba898931a data/createnuclear/advancement/recipes/ 572db9bd6741ae0f5fe035ac53ceec45c869eb05 data/createnuclear/advancement/recipes/misc/smelting/lead_ingot_for_lead.json d468ba59b25ddbffeb5a3a1e298f02e93246bc87 data/createnuclear/advancement/recipes/misc/smelting/lead_ingot_for_lead_ore.json 77cdcf8ebae5a8146f7c1ceb39567a9f83ab4c62 data/createnuclear/advancement/recipes/misc/smelting/lead_ingot_for_raw_lead.json +6c00d3701cf637fa20148b4740856769057c9fd6 data/createnuclear/advancement/recipes/misc/smelting/nitrogen_concentrate_for_nitrogen_concentrate.json 181b98bed073bdbbf3a20bb3d0d886057359da9e data/createnuclear/advancement/recipes/misc/smelting/raw_uranium_for_uranium_ore.json 6b6936bf71a27ec4e5fbad575971f7a87685e03f data/createnuclear/recipe/blasting/lead_ingot_for_lead.json 2e8b61aeb37329a5a1d20a4032cfa0972b3aa35b data/createnuclear/recipe/blasting/lead_ingot_for_lead_ore.json caf2536990c02b52965faf41000479d173ae5ce3 data/createnuclear/recipe/blasting/lead_ingot_for_raw_lead.json +6a46fd45b7623bb32be4be34ce2276cfb05e288c data/createnuclear/recipe/blasting/nitrogen_concentrate_for_nitrogen_concentrate.json 43584c0fb02633ea6ada2b24cea19560ac9e5498 data/createnuclear/recipe/blasting/raw_uranium_for_uranium_ore.json dbca4445a4f024da2c2cc7c88e885639964800d4 data/createnuclear/recipe/crafting/crafting/lead_block_from_compacting.json 9c8258c26e0028851e583b7278122d3e36bcd77f data/createnuclear/recipe/crafting/crafting/lead_ingot_from_compacting.json @@ -34,4 +37,5 @@ fd535efce0c108d879e5a1f13aface5586fc3127 data/createnuclear/recipe/crafting/craf b63c594645138909f08b9d2e587b08534c58b319 data/createnuclear/recipe/smelting/lead_ingot_for_lead.json 8dc067a59870db19ecdac45dca24aedfe2f89eb4 data/createnuclear/recipe/smelting/lead_ingot_for_lead_ore.json 4608b430898214bae0648f7a2383bd9d49aeac8e data/createnuclear/recipe/smelting/lead_ingot_for_raw_lead.json +78a1035e66960224af77af912804f14d15c3cd30 data/createnuclear/recipe/smelting/nitrogen_concentrate_for_nitrogen_concentrate.json e4e201f37ebd694e4cc9a0acc6b76231504d0a4b data/createnuclear/recipe/smelting/raw_uranium_for_uranium_ore.json diff --git a/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea b/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea index 54be547..26181ae 100644 --- a/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea +++ b/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea @@ -1,4 +1,4 @@ -// 1.21.1 2026-08-06T17:43:42.187289 CreateNuclear Generated Registry Entries +// 1.21.1 2026-08-07T16:22:08.564305 CreateNuclear Generated Registry Entries aa1897ff27a6aa83e2efbee29e12ad6dab2f6a0a data/createnuclear/createnuclear/fluids/type/fallback.json d7c754aa51cea393a10bce85986c1c0c641150d5 data/createnuclear/createnuclear/fluids/type/nitrogen.json afee3d8f15bf8285e175f73befba7b46fdc94b19 data/createnuclear/createnuclear/fluids/type/water.json @@ -20,8 +20,8 @@ b0e1ee7314412507fd7346cb48b29d105f6186ad data/createnuclear/worldgen/configured_ 59d61c02881d710b0426a0955f6945b7a12d219f data/createnuclear/worldgen/density_function/irradiated/final_density.json 7f5f110a211b82bc22627b2f901c5f3c6a1265dd data/createnuclear/worldgen/noise/irradiated/erosion.json ea836bafce53bcb743cb2de5ba38271291483865 data/createnuclear/worldgen/noise_settings/irradiated_noise.json -b5a36f76a9c55adc22eaafc5e7de40896777115e data/createnuclear/worldgen/placed_feature/lead_ore.json -32be128c45153cbbbb0b45cb2cc0d45d03864b47 data/createnuclear/worldgen/placed_feature/nitrate_ore.json -f26be417cb34461ecb180e77a9a749eaaf4c9880 data/createnuclear/worldgen/placed_feature/striated_ores_overworld.json -73b8f3c6a9d78055f31e64cad12b02bf25cbd3d1 data/createnuclear/worldgen/placed_feature/thorium_ore.json -e3bd0bd52f43a5df9eef0b23007da524628b17e7 data/createnuclear/worldgen/placed_feature/uranium_ore.json +5a035ad45f9039b81e3e55160da3127fe7079ba9 data/createnuclear/worldgen/placed_feature/lead_ore.json +e69f61cbb4bf2c50a6123ddc87c024c801bb78d1 data/createnuclear/worldgen/placed_feature/nitrate_ore.json +cc85909071cab20eacbe2c34887c6ed6a02dc51e data/createnuclear/worldgen/placed_feature/striated_ores_overworld.json +0762472dada74fb4592de79d598f8d45d955ea2c data/createnuclear/worldgen/placed_feature/thorium_ore.json +a18aa32c139932d0023abe6caa722992b167114b data/createnuclear/worldgen/placed_feature/uranium_ore.json diff --git a/src/generated/resources/data/createnuclear/advancement/recipes/misc/blasting/nitrogen_concentrate_for_nitrogen_concentrate.json b/src/generated/resources/data/createnuclear/advancement/recipes/misc/blasting/nitrogen_concentrate_for_nitrogen_concentrate.json new file mode 100644 index 0000000..21ae941 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancement/recipes/misc/blasting/nitrogen_concentrate_for_nitrogen_concentrate.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "createnuclear:nitrate" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:blasting/nitrogen_concentrate_for_nitrogen_concentrate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:blasting/nitrogen_concentrate_for_nitrogen_concentrate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancement/recipes/misc/smelting/nitrogen_concentrate_for_nitrogen_concentrate.json b/src/generated/resources/data/createnuclear/advancement/recipes/misc/smelting/nitrogen_concentrate_for_nitrogen_concentrate.json new file mode 100644 index 0000000..e1208f4 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancement/recipes/misc/smelting/nitrogen_concentrate_for_nitrogen_concentrate.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "createnuclear:nitrate" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smelting/nitrogen_concentrate_for_nitrogen_concentrate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smelting/nitrogen_concentrate_for_nitrogen_concentrate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipe/blasting/nitrogen_concentrate_for_nitrogen_concentrate.json b/src/generated/resources/data/createnuclear/recipe/blasting/nitrogen_concentrate_for_nitrogen_concentrate.json new file mode 100644 index 0000000..ccf99fe --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipe/blasting/nitrogen_concentrate_for_nitrogen_concentrate.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:blasting", + "category": "misc", + "cookingtime": 100, + "experience": 0.1, + "ingredient": { + "item": "createnuclear:nitrate" + }, + "result": { + "count": 1, + "id": "createnuclear:nitrogen_concentrate" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipe/deploying/reactor_fluid_input_from_fluid_pipe_and_reactor_casing.json b/src/generated/resources/data/createnuclear/recipe/deploying/reactor_fluid_input_from_fluid_pipe_and_reactor_casing.json new file mode 100644 index 0000000..59cf97a --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipe/deploying/reactor_fluid_input_from_fluid_pipe_and_reactor_casing.json @@ -0,0 +1,16 @@ +{ + "type": "create:deploying", + "ingredients": [ + { + "item": "createnuclear:reactor_casing" + }, + { + "item": "create:fluid_pipe" + } + ], + "results": [ + { + "id": "createnuclear:reactor_fluid_input" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipe/item_application/reactor_output_from_shaft_and_reactor_casing.json b/src/generated/resources/data/createnuclear/recipe/deploying/reactor_output_from_shaft_and_reactor_casing.json similarity index 84% rename from src/generated/resources/data/createnuclear/recipe/item_application/reactor_output_from_shaft_and_reactor_casing.json rename to src/generated/resources/data/createnuclear/recipe/deploying/reactor_output_from_shaft_and_reactor_casing.json index 8a7ee3f..31a4ae0 100644 --- a/src/generated/resources/data/createnuclear/recipe/item_application/reactor_output_from_shaft_and_reactor_casing.json +++ b/src/generated/resources/data/createnuclear/recipe/deploying/reactor_output_from_shaft_and_reactor_casing.json @@ -1,5 +1,5 @@ { - "type": "create:item_application", + "type": "create:deploying", "ingredients": [ { "item": "createnuclear:reactor_casing" diff --git a/src/generated/resources/data/createnuclear/recipe/item_application/reactor_input_from_hopper_and_reactor_casing.json b/src/generated/resources/data/createnuclear/recipe/deploying/reactor_rod_input_from_hopper_and_reactor_casing.json similarity index 84% rename from src/generated/resources/data/createnuclear/recipe/item_application/reactor_input_from_hopper_and_reactor_casing.json rename to src/generated/resources/data/createnuclear/recipe/deploying/reactor_rod_input_from_hopper_and_reactor_casing.json index a82504d..1c36012 100644 --- a/src/generated/resources/data/createnuclear/recipe/item_application/reactor_input_from_hopper_and_reactor_casing.json +++ b/src/generated/resources/data/createnuclear/recipe/deploying/reactor_rod_input_from_hopper_and_reactor_casing.json @@ -1,5 +1,5 @@ { - "type": "create:item_application", + "type": "create:deploying", "ingredients": [ { "item": "createnuclear:reactor_casing" diff --git a/src/generated/resources/data/createnuclear/recipe/mixing/liquid_nitrogen.json b/src/generated/resources/data/createnuclear/recipe/mixing/liquid_nitrogen.json new file mode 100644 index 0000000..fbd6d3f --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipe/mixing/liquid_nitrogen.json @@ -0,0 +1,18 @@ +{ + "type": "create:mixing", + "ingredients": [ + { + "item": "createnuclear:cooled_nitrogen_concentrate" + }, + { + "item": "minecraft:ice" + } + ], + "processing_time": 20, + "results": [ + { + "amount": 100, + "id": "createnuclear:nitrogen" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipe/smelting/nitrogen_concentrate_for_nitrogen_concentrate.json b/src/generated/resources/data/createnuclear/recipe/smelting/nitrogen_concentrate_for_nitrogen_concentrate.json new file mode 100644 index 0000000..7af575d --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipe/smelting/nitrogen_concentrate_for_nitrogen_concentrate.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smelting", + "category": "misc", + "cookingtime": 200, + "experience": 0.1, + "ingredient": { + "item": "createnuclear:nitrate" + }, + "result": { + "count": 1, + "id": "createnuclear:nitrogen_concentrate" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipe/snow_powder/cooled_nitrogen_concentrate.json b/src/generated/resources/data/createnuclear/recipe/snow_powder/cooled_nitrogen_concentrate.json new file mode 100644 index 0000000..c5cbc83 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipe/snow_powder/cooled_nitrogen_concentrate.json @@ -0,0 +1,13 @@ +{ + "type": "createnuclear:snow_powder", + "ingredients": [ + { + "item": "createnuclear:nitrogen_concentrate" + } + ], + "results": [ + { + "id": "createnuclear:cooled_nitrogen_concentrate" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/tags/block/fan_processing_catalysts/snow_powder.json b/src/generated/resources/data/createnuclear/tags/block/fan_processing_catalysts/snow_powder.json new file mode 100644 index 0000000..38b8ecd --- /dev/null +++ b/src/generated/resources/data/createnuclear/tags/block/fan_processing_catalysts/snow_powder.json @@ -0,0 +1,5 @@ +{ + "values": [ + "minecraft:powder_snow" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/worldgen/placed_feature/lead_ore.json b/src/generated/resources/data/createnuclear/worldgen/placed_feature/lead_ore.json index 7b95187..11ba3bd 100644 --- a/src/generated/resources/data/createnuclear/worldgen/placed_feature/lead_ore.json +++ b/src/generated/resources/data/createnuclear/worldgen/placed_feature/lead_ore.json @@ -21,7 +21,7 @@ } }, { - "type": "create:config_filter" + "type": "createnuclear:config_filter" } ] } \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/worldgen/placed_feature/nitrate_ore.json b/src/generated/resources/data/createnuclear/worldgen/placed_feature/nitrate_ore.json index 4b98acb..cdfa1f6 100644 --- a/src/generated/resources/data/createnuclear/worldgen/placed_feature/nitrate_ore.json +++ b/src/generated/resources/data/createnuclear/worldgen/placed_feature/nitrate_ore.json @@ -21,7 +21,7 @@ } }, { - "type": "create:config_filter" + "type": "createnuclear:config_filter" } ] } \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/worldgen/placed_feature/striated_ores_overworld.json b/src/generated/resources/data/createnuclear/worldgen/placed_feature/striated_ores_overworld.json index d5ec73f..7af1397 100644 --- a/src/generated/resources/data/createnuclear/worldgen/placed_feature/striated_ores_overworld.json +++ b/src/generated/resources/data/createnuclear/worldgen/placed_feature/striated_ores_overworld.json @@ -21,7 +21,7 @@ } }, { - "type": "create:config_filter" + "type": "createnuclear:config_filter" } ] } \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/worldgen/placed_feature/thorium_ore.json b/src/generated/resources/data/createnuclear/worldgen/placed_feature/thorium_ore.json index f1ec761..2b26066 100644 --- a/src/generated/resources/data/createnuclear/worldgen/placed_feature/thorium_ore.json +++ b/src/generated/resources/data/createnuclear/worldgen/placed_feature/thorium_ore.json @@ -21,7 +21,7 @@ } }, { - "type": "create:config_filter" + "type": "createnuclear:config_filter" } ] } \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/worldgen/placed_feature/uranium_ore.json b/src/generated/resources/data/createnuclear/worldgen/placed_feature/uranium_ore.json index 8f09b17..f5af6eb 100644 --- a/src/generated/resources/data/createnuclear/worldgen/placed_feature/uranium_ore.json +++ b/src/generated/resources/data/createnuclear/worldgen/placed_feature/uranium_ore.json @@ -21,7 +21,7 @@ } }, { - "type": "create:config_filter" + "type": "createnuclear:config_filter" } ] } \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/CNRecipeTypes.java b/src/main/java/net/nuclearteam/createnuclear/CNRecipeTypes.java index 2b79d3d..b15e2d2 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNRecipeTypes.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNRecipeTypes.java @@ -16,6 +16,7 @@ import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; import net.nuclearteam.createnuclear.content.kinetics.fan.processing.EnrichedRecipe; +import net.nuclearteam.createnuclear.content.kinetics.fan.processing.SnowPowderRecipe; import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -26,7 +27,8 @@ @SuppressWarnings({"unused", "unchecked"}) public enum CNRecipeTypes implements IRecipeTypeInfo, StringRepresentable { - ENRICHED(EnrichedRecipe::new) + ENRICHED(EnrichedRecipe::new), + SNOW_POWDER(SnowPowderRecipe::new) ; public static final Predicate> CAN_BE_AUTOMATED = r -> !r.id() diff --git a/src/main/java/net/nuclearteam/createnuclear/CNTags.java b/src/main/java/net/nuclearteam/createnuclear/CNTags.java index 29cbea3..fb93d74 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNTags.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNTags.java @@ -71,6 +71,7 @@ public enum NameSpace { public enum CNBlockTags { FAN_PROCESSING_CATALYSTS_ENRICHED(MOD, "fan_processing_catalysts/enriched"), + FAN_PROCESSING_CATALYSTS_SNOW_POWDER(MOD, "fan_processing_catalysts/snow_powder"), ENRICHING_FIRE_BASE_BLOCKS, THORIUM_ORES, URANIUM_ORES, diff --git a/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java b/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java index 35dcd46..eba20ac 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java +++ b/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java @@ -30,6 +30,7 @@ import net.nuclearteam.createnuclear.foundation.advancement.CNTriggers; import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; import net.nuclearteam.createnuclear.infrastructure.data.CreateNuclearDatagen; +import net.nuclearteam.createnuclear.infrastructure.worldgen.CNPlacementModifiers; import net.nuclearteam.createnuclear.infrastructure.worldgen.biome.surfacerule.BiomeTagRule; import org.slf4j.Logger; @@ -92,6 +93,7 @@ public static void onCtor(IEventBus modEventBus, ModContainer modContainer) { CNParticleRegistry.DEF_REG.register(modEventBus); CNRecipeTypes.register(modEventBus); CNAttributes.register(modEventBus); + CNPlacementModifiers.register(modEventBus); modEventBus.addListener(CreateNuclear::init); modEventBus.addListener(CreateNuclear::onRegister); diff --git a/src/main/java/net/nuclearteam/createnuclear/compat/jei/CreateNuclearJEI.java b/src/main/java/net/nuclearteam/createnuclear/compat/jei/CreateNuclearJEI.java index fa22835..67eaca8 100644 --- a/src/main/java/net/nuclearteam/createnuclear/compat/jei/CreateNuclearJEI.java +++ b/src/main/java/net/nuclearteam/createnuclear/compat/jei/CreateNuclearJEI.java @@ -32,6 +32,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.item.alchemy.Potion; import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.item.crafting.Recipe; @@ -43,7 +44,9 @@ import net.nuclearteam.createnuclear.CNRecipeTypes; import net.nuclearteam.createnuclear.CreateNuclear; import net.nuclearteam.createnuclear.compat.jei.category.FanEnrichedCategory; +import net.nuclearteam.createnuclear.compat.jei.category.FanSnowPowderCategory; import net.nuclearteam.createnuclear.content.kinetics.fan.processing.EnrichedRecipe; +import net.nuclearteam.createnuclear.content.kinetics.fan.processing.SnowPowderRecipe; import javax.annotation.Nonnull; import javax.annotation.ParametersAreNonnullByDefault; @@ -72,7 +75,13 @@ private void loadCategories() { .catalystStack(ProcessingViaFanCategory.getFan("fan_enriched")) .doubleItemIcon(AllItems.PROPELLER.get(), CNBlocks.ENRICHING_CAMPFIRE.get()) .emptyBackground(178, 72) - .build("fan_enriched", FanEnrichedCategory::new) + .build("fan_enriched", FanEnrichedCategory::new), + snow_powder = builder(SnowPowderRecipe.class) + .addTypedRecipes(CNRecipeTypes.SNOW_POWDER::getType) + .catalystStack(ProcessingViaFanCategory.getFan("fan_snow_powder")) + .doubleItemIcon(AllItems.PROPELLER.get(), Items.POWDER_SNOW_BUCKET) + .emptyBackground(178, 72) + .build("fan_snow_powder", FanSnowPowderCategory::new) ; } diff --git a/src/main/java/net/nuclearteam/createnuclear/compat/jei/category/FanSnowPowderCategory.java b/src/main/java/net/nuclearteam/createnuclear/compat/jei/category/FanSnowPowderCategory.java new file mode 100644 index 0000000..45aa509 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/compat/jei/category/FanSnowPowderCategory.java @@ -0,0 +1,40 @@ +package net.nuclearteam.createnuclear.compat.jei.category; + +import com.simibubi.create.compat.jei.category.ProcessingViaFanCategory; +import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics; +import com.simibubi.create.foundation.gui.AllGuiTextures; +import net.createmod.catnip.gui.element.GuiGameElement; +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.minecraft.world.level.block.Blocks; +import net.nuclearteam.createnuclear.content.kinetics.fan.processing.SnowPowderRecipe; + +import javax.annotation.ParametersAreNonnullByDefault; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +public class FanSnowPowderCategory extends ProcessingViaFanCategory.MultiOutput { + public FanSnowPowderCategory(Info info) { + super(info); + } + + @Override + protected AllGuiTextures getBlockShadow() { + return AllGuiTextures.JEI_LIGHT; + } + + @Override + protected void renderAttachedBlock(GuiGraphics graphics) { + GuiGameElement.of(Blocks.POWDER_SNOW.defaultBlockState()) + .scale(SCALE) + .atLocal(0, 0, 2) + .lighting(AnimatedKinetics.DEFAULT_LIGHTING) + .render(graphics); + } + + @Override + public Component getTitle() { + return Component.translatable("createnuclear.snow_powder.fan.recipe"); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/kinetics/fan/processing/CNFanProcessingTypes.java b/src/main/java/net/nuclearteam/createnuclear/content/kinetics/fan/processing/CNFanProcessingTypes.java index 0f99368..64b1ac5 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/kinetics/fan/processing/CNFanProcessingTypes.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/kinetics/fan/processing/CNFanProcessingTypes.java @@ -12,6 +12,7 @@ import net.minecraft.core.particles.ParticleTypes; import net.minecraft.util.RandomSource; import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; @@ -32,12 +33,14 @@ @SuppressWarnings("unused") public class CNFanProcessingTypes { public static final EnrichedType ENRICHED = register("enriched", new EnrichedType()); + public static final SnowPowderType SNOW_POWDER = register("snow_powder", new SnowPowderType()); private static final Map LEGACY_NAME_MAP; static { Object2ReferenceOpenHashMap map = new Object2ReferenceOpenHashMap<>(); map.put("ENRICHED", ENRICHED); + map.put("SNOW_POWDER", SNOW_POWDER); map.trim(); LEGACY_NAME_MAP = map; } @@ -119,4 +122,60 @@ public void affectEntity(Entity entity, Level level) { } } } + + public static class SnowPowderType implements FanProcessingType { + + @Override + public boolean isValidAt(Level level, BlockPos pos) { + BlockState state = level.getBlockState(pos); + return CNTags.CNBlockTags.FAN_PROCESSING_CATALYSTS_SNOW_POWDER.matches(state); + } + + @Override + public int getPriority() { + return 301; + } + + @Override + public boolean canProcess(ItemStack stack, Level level) { + Optional>> recipe = CNRecipeTypes.SNOW_POWDER.find(new SingleRecipeInput(stack), level); + return recipe.isPresent(); + } + + @Nullable + @Override + public List process(ItemStack stack, Level level) { + return CNRecipeTypes.SNOW_POWDER.find(new SingleRecipeInput(stack), level) + .map(RecipeHolder::value) + .map(r -> RecipeApplier.applyRecipeOn(level, stack, r, true)) + .orElse(null); + } + + @Override + public void spawnProcessingParticles(Level level, Vec3 pos) { + if (level.random.nextInt(8) != 0) return; + pos = pos.add(VecHelper.offsetRandomly(Vec3.ZERO, level.random, 1) + .multiply(1, 0.5f, 1) + .normalize() + .scale(0.15f) + ); + level.addParticle(ParticleTypes.SNOWFLAKE, pos.x, pos.y + .45f, pos.z, 0.0, 0.0, 0.0); + if (level.random.nextInt(2) != 0) level.addParticle(ParticleTypes.SNEEZE, pos.x, pos.y + .25f, pos.z, 0.0, 0.0, 0.0); + } + + @Override + public void morphAirFlow(AirFlowParticleAccess particleAccess, RandomSource random) { + particleAccess.setColor(Color.mixColors(0x0, 0x49FFFB, random.nextFloat())); + particleAccess.setAlpha(1f); + if (random.nextFloat() < 1 / 128f) particleAccess.spawnExtraParticle(ParticleTypes.SNOWFLAKE, .125f); + if (random.nextFloat() < 1 / 32f) particleAccess.spawnExtraParticle(ParticleTypes.SNEEZE, .125f); + } + + @Override + public void affectEntity(Entity entity, Level level) { + if (entity instanceof LivingEntity livingEntity) { + livingEntity.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 10, 0, true, true)); + } + } + } } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/kinetics/fan/processing/SnowPowderRecipe.java b/src/main/java/net/nuclearteam/createnuclear/content/kinetics/fan/processing/SnowPowderRecipe.java new file mode 100644 index 0000000..8ca555b --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/kinetics/fan/processing/SnowPowderRecipe.java @@ -0,0 +1,36 @@ +package net.nuclearteam.createnuclear.content.kinetics.fan.processing; + +import javax.annotation.ParametersAreNonnullByDefault; + +import com.simibubi.create.content.processing.recipe.ProcessingRecipeParams; +import com.simibubi.create.content.processing.recipe.StandardProcessingRecipe; +import net.minecraft.world.item.crafting.SingleRecipeInput; +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.CNRecipeTypes; + +@ParametersAreNonnullByDefault +public class SnowPowderRecipe extends StandardProcessingRecipe { + + public SnowPowderRecipe(ProcessingRecipeParams params) { + super(CNRecipeTypes.SNOW_POWDER, params); + } + + @Override + public boolean matches(SingleRecipeInput inv, Level worldIn) { + if (inv.isEmpty()) + return false; + return ingredients.get(0) + .test(inv.getItem(0)); + } + + @Override + protected int getMaxInputCount() { + return 1; + } + + @Override + protected int getMaxOutputCount() { + return 12; + } + +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNDeployingRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNDeployingRecipeGen.java new file mode 100644 index 0000000..83227ef --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNDeployingRecipeGen.java @@ -0,0 +1,55 @@ +package net.nuclearteam.createnuclear.foundation.data.recipe; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.api.data.recipe.DeployingRecipeGen; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.ItemLike; +import net.nuclearteam.createnuclear.CNBlocks; +import net.nuclearteam.createnuclear.CreateNuclear; + +import java.util.concurrent.CompletableFuture; + +public class CNDeployingRecipeGen extends DeployingRecipeGen { + + GeneratedRecipe REACTOR_ROD_INPUT = deploying("reactor_rod_input_from_hopper_and_reactor_casing", + Items.HOPPER, + CNBlocks.REACTOR_CASING.get(), + CNBlocks.REACTOR_ROD_INPUT.get() + ); + + GeneratedRecipe REACTOR_FLUID_INPUT = deploying("reactor_fluid_input_from_fluid_pipe_and_reactor_casing", + AllBlocks.FLUID_PIPE.asItem(), + CNBlocks.REACTOR_CASING.get(), + CNBlocks.REACTOR_FLUID_INPUT.get() + ); + + GeneratedRecipe REACTOR_OUTPUT = deploying("reactor_output_from_shaft_and_reactor_casing", + AllBlocks.SHAFT.asItem(), + CNBlocks.REACTOR_CASING.get(), + CNBlocks.REACTOR_OUTPUT.get() + ); + + protected GeneratedRecipe deploying(String name, Ingredient ingredient, ItemLike input, ItemLike output) { + return create(CreateNuclear.asResource(name), b -> + b.require(input) + .require(ingredient) + .output(output) + ); + } + + protected GeneratedRecipe deploying(String name, Item ingredient, ItemLike input, ItemLike output) { + return create(CreateNuclear.asResource(name), b -> + b.require(input) + .require(ingredient) + .output(output) + ); + } + + public CNDeployingRecipeGen(PackOutput output, CompletableFuture registries) { + super(output, registries, CreateNuclear.MOD_ID); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNItemApplicationRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNItemApplicationRecipeGen.java index d02d622..d196fb2 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNItemApplicationRecipeGen.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNItemApplicationRecipeGen.java @@ -22,18 +22,6 @@ public class CNItemApplicationRecipeGen extends ItemApplicationRecipeGen { CNBlocks.REACTOR_CASING.get() ); - GeneratedRecipe REACTOR_OUTPUT = itemApplication("reactor_output_from_shaft_and_reactor_casing", - AllBlocks.SHAFT.asItem(), - CNBlocks.REACTOR_CASING.get(), - CNBlocks.REACTOR_OUTPUT.get() - ); - - GeneratedRecipe REACTOR_INPUT = itemApplication("reactor_input_from_hopper_and_reactor_casing", - Items.HOPPER, - CNBlocks.REACTOR_CASING.get(), - CNBlocks.REACTOR_ROD_INPUT.get() - ); - protected GeneratedRecipe itemApplication(String name, Ingredient ingredient, ItemLike input, ItemLike output) { return create(CreateNuclear.asResource(name), b -> b.require(input) diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNMixingRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNMixingRecipeGen.java index a95cba5..39b9fd1 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNMixingRecipeGen.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNMixingRecipeGen.java @@ -3,6 +3,7 @@ import com.simibubi.create.api.data.recipe.MixingRecipeGen; import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; +import net.minecraft.world.item.Items; import net.neoforged.neoforge.common.Tags; import net.nuclearteam.createnuclear.CNFluids; import net.nuclearteam.createnuclear.CNItems; @@ -23,6 +24,13 @@ public class CNMixingRecipeGen extends MixingRecipeGen { URANIUM_FLUID = create("uranium_fluid", b -> b .require(CNTags.forgeItemTag("dusts/uranium")) .output(CNFluids.URANIUM.get(), 25) + ), + + NITROGEN = create("liquid_nitrogen", b -> b + .require(CNItems.COOLED_NITROGEN_CONCENTRATE) + .duration(20) + .require(Items.ICE) + .output(CNFluids.LIQUID_NITROGEN.get(), 100) ) ; diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNRecipeProvider.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNRecipeProvider.java index efabd09..0baa55b 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNRecipeProvider.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNRecipeProvider.java @@ -44,14 +44,16 @@ public static void registerAllProcessing(DataGenerator gen, PackOutput output, C GENERATORS.add(new CNMixingRecipeGen(output, registries)); GENERATORS.add(new CNPressingRecipeGen(output, registries)); GENERATORS.add(new CNEnrichedRecipeGen(output, registries)); + GENERATORS.add(new CNSnowPowderRecipeGen(output, registries)); GENERATORS.add(new CNWashingRecipeGen(output, registries)); + GENERATORS.add(new CNDeployingRecipeGen(output, registries)); gen.addProvider(true, new DataProvider() { @Override public String getName() { - return "Create's Processing Recipes"; + return "CreateNuclear's Processing Recipes"; } @Override diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNSnowPowderRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNSnowPowderRecipeGen.java new file mode 100644 index 0000000..8ce03bb --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNSnowPowderRecipeGen.java @@ -0,0 +1,20 @@ +package net.nuclearteam.createnuclear.foundation.data.recipe; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.nuclearteam.createnuclear.CNItems; +import net.nuclearteam.createnuclear.CreateNuclear; + +import java.util.concurrent.CompletableFuture; + +public class CNSnowPowderRecipeGen extends SnowPowderRecipeGen { + + GeneratedRecipe + COOLED_NITROGEN_CONCENTRATE = convert(CNItems.NITROGEN_CONCENTRATE, CNItems.COOLED_NITROGEN_CONCENTRATE) + ; + + public CNSnowPowderRecipeGen(PackOutput output, CompletableFuture registries) { + super(output, registries, CreateNuclear.MOD_ID); + } + +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNStandardRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNStandardRecipeGen.java index e575c40..855e468 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNStandardRecipeGen.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNStandardRecipeGen.java @@ -96,7 +96,8 @@ public class CNStandardRecipeGen extends BaseRecipeProvider { URANIUM_ORE_TO_URANIUM_POWDER = blastFurnaceRecipeTags(() -> CNItems.RAW_URANIUM::get, () -> CNItemTags.URANIUM_ORES.tag, "_for_uranium_ore", 4), RAW_LEAD_ORES = blastFurnaceRecipeTags(() -> CNItems.LEAD_INGOT::get, () -> CNItemTags.LEAD_ORES.tag, "_for_lead_ore", 1), RAW_LEAD = blastFurnaceRecipeTags(CNItems.LEAD_INGOT::get, () -> CNTags.forgeItemTag("raw_materials/lead"), "_for_raw_lead", 1), - CRUSHED_RAW_LEAD_TO_LEAD_BLAST_FURNACE = blastFurnaceRecipe(CNItems.LEAD_INGOT::get, AllItems.CRUSHED_LEAD::get, "_for_lead", 1) + CRUSHED_RAW_LEAD_TO_LEAD_BLAST_FURNACE = blastFurnaceRecipe(CNItems.LEAD_INGOT::get, AllItems.CRUSHED_LEAD::get, "_for_lead", 1), + NITROGEN_CONCENTRATE = blastFurnaceRecipe(CNItems.NITROGEN_CONCENTRATE::get, CNItems.NITRATE::get, "_for_nitrogen_concentrate", 1) ; static class Marker { diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/SnowPowderRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/SnowPowderRecipeGen.java new file mode 100644 index 0000000..41038d9 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/SnowPowderRecipeGen.java @@ -0,0 +1,43 @@ +package net.nuclearteam.createnuclear.foundation.data.recipe; + +import com.simibubi.create.api.data.recipe.ProcessingRecipeGen; +import com.simibubi.create.api.data.recipe.StandardProcessingRecipeGen; +import net.createmod.catnip.registry.RegisteredObjectsHelper; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.ItemLike; +import net.nuclearteam.createnuclear.CNRecipeTypes; +import net.nuclearteam.createnuclear.content.kinetics.fan.processing.SnowPowderRecipe; + +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +/** + * The base class for Snow Powder recipe generation. + * Addons should extend this and use the {@link ProcessingRecipeGen#create} methods + * or the helper methods contained in this class to make recipes. + * For an example of how you might do this, see {@link net.nuclearteam.createnuclear.foundation.data.recipe.CNSnowPowderRecipeGen}. + * Needs to be added to a registered recipe provider to do anything, see {@link net.nuclearteam.createnuclear.foundation.data.recipe.CNRecipeProvider} + */ +public abstract class SnowPowderRecipeGen extends StandardProcessingRecipeGen { + public GeneratedRecipe convert(ItemLike input, ItemLike result) { + return convert(() -> Ingredient.of(input), () -> result); + } + + public GeneratedRecipe convert(Supplier input, Supplier result) { + return create(asResource(RegisteredObjectsHelper.getKeyOrThrow(result.get().asItem()) + .getPath()), + p -> p.withItemIngredients(input.get()) + .output(result.get())); + } + + public SnowPowderRecipeGen(PackOutput output, CompletableFuture registries, String defaultNamespace) { + super(output, registries, defaultNamespace); + } + + @Override + protected CNRecipeTypes getRecipeType() { + return CNRecipeTypes.SNOW_POWDER; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CWorldGen.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CWorldGen.java index ea7de34..e716179 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CWorldGen.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CWorldGen.java @@ -3,7 +3,7 @@ import net.createmod.catnip.config.ConfigBase; public class CWorldGen extends ConfigBase { - public final ConfigBool disable = b(false, "disableWorldGen", Comments.disable); + public final ConfigBool enable = b(true, "enable_world_gen", Comments.enable); @Override public String getName() { @@ -11,6 +11,6 @@ public String getName() { } private static class Comments { - static String disable = "Prevents all worldgen added by Create from taking effect"; + static String enable = "When true, CreateNuclear world generation features are active. Set to false to disable all added ores/structures."; } -} +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CreateNuclearRegistrateTags.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CreateNuclearRegistrateTags.java index 9d8cf74..3819605 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CreateNuclearRegistrateTags.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CreateNuclearRegistrateTags.java @@ -9,6 +9,7 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.Fluid; import net.nuclearteam.createnuclear.CNBlocks; import net.nuclearteam.createnuclear.CNEntityType; @@ -38,6 +39,10 @@ private static void genBlockTags(RegistrateTagsProvider provIn) { .add(CNBlocks.ENRICHING_FIRE.get()) ; + prov.tag(CNBlockTags.FAN_PROCESSING_CATALYSTS_SNOW_POWDER.tag) + .add(Blocks.POWDER_SNOW) + ; + for (CNBlockTags tag : CNBlockTags.values()) { if (tag.alwaysDatagen) { prov.getOrCreateRawBuilder(tag.tag); diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNPlacedFeatures.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNPlacedFeatures.java index c1e5675..a8efc39 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNPlacedFeatures.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNPlacedFeatures.java @@ -1,6 +1,5 @@ package net.nuclearteam.createnuclear.infrastructure.worldgen; -import com.simibubi.create.infrastructure.worldgen.ConfigPlacementFilter; import net.minecraft.core.Holder; import net.minecraft.core.HolderGetter; import net.minecraft.core.registries.Registries; diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNPlacementModifiers.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNPlacementModifiers.java new file mode 100644 index 0000000..c940802 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNPlacementModifiers.java @@ -0,0 +1,18 @@ +package net.nuclearteam.createnuclear.infrastructure.worldgen; + +import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.levelgen.placement.PlacementModifierType; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import net.nuclearteam.createnuclear.CreateNuclear; + +public class CNPlacementModifiers { + private static final DeferredRegister> REGISTER = DeferredRegister.create(Registries.PLACEMENT_MODIFIER_TYPE, CreateNuclear.MOD_ID); + + public static final DeferredHolder, PlacementModifierType> CONFIG_FILTER = REGISTER.register("config_filter", () -> () -> ConfigPlacementFilter.CODEC); + + public static void register(IEventBus modEventBus) { + REGISTER.register(modEventBus); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/ConfigPlacementFilter.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/ConfigPlacementFilter.java new file mode 100644 index 0000000..b727387 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/ConfigPlacementFilter.java @@ -0,0 +1,24 @@ +package net.nuclearteam.createnuclear.infrastructure.worldgen; + +import com.mojang.serialization.MapCodec; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.levelgen.placement.PlacementContext; +import net.minecraft.world.level.levelgen.placement.PlacementFilter; +import net.minecraft.world.level.levelgen.placement.PlacementModifierType; +import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; + +public class ConfigPlacementFilter extends PlacementFilter { + public static final ConfigPlacementFilter INSTANCE = new ConfigPlacementFilter(); + public static final MapCodec CODEC = MapCodec.unit(() -> INSTANCE); + + @Override + protected boolean shouldPlace(PlacementContext pContext, RandomSource pRandom, BlockPos pPos) { + return CNConfigs.common().worldGen.enable.get(); + } + + @Override + public PlacementModifierType type() { + return CNPlacementModifiers.CONFIG_FILTER.get(); + } +} \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/textures/block/reactor/casing/casing_inner.png b/src/main/resources/assets/createnuclear/textures/block/reactor/casing/casing_inner.png deleted file mode 100644 index 5783d71816fc36c33a2a22c92411aee7a40e64ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 514 zcmV+d0{#7oP)~iXXmP_*lafTE}uV!VaRkk#rJ)**564|qP3>)dxl|n z0UZ78;QKyVmLa9I?s*=o)r!ev0$_ofHh5(EKK%9ldJRDU zFmhd&AP5M<5YO|FQnFkwky0`qk8M$wWhkXAGZP;fy2jhKwIbGaZT)yW(zY$bFwpls zP1B&1`qIDz%d)i8Z@1gaC_)JC_d89~*ezHQg%Ffw$#%Q71<%j8sw#VS9OqS|q9{ny zlswPhUYY6go26+=Q51aacDv6cNtn%MZ=Ii4`M=-!A1ch=6`_-$#Q*>R07*qoM6N<$ Eg0fQN4gdfE diff --git a/src/main/resources/assets/createnuclear/textures/block/reactor/casing/casing_top.png b/src/main/resources/assets/createnuclear/textures/block/reactor/casing/casing_top.png deleted file mode 100644 index c4d4460ca4bcee16e1c2d8492ac71f7c826c025f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 491 zcmVJNR5*=&ld-DmKoEw%b9RMnh$Lbqmgz*auuKYD-_S}p50h6A zB3N4*NwOQv%Dsi`-l&%|FfhBB`RAWMvtO&#>Q5ZUD5U@pLg4K2c=$UPyK~#NR8@sc zk_2N6o6QEm0~urZ&5EKRNfKlb1gzIb$zG#dH1?|aWeYfYAAlx2w&LLh`- zGMR8Z9*N`l*Uq=wjm2W&&vN)Nj$>xC8DSV=t^JoICDvN*_xp<$0N?K&!Z0MybEK5s zl~U|>JEqeq@D$hi2LQm&&kq3BTCBCybo_fKL6hff2X1QGYg5er>UFYNZeEzCY+qM)%L6&77TQ+=|?^YDWQ?sh7NRouIEI*2d hfbY*)DMeLP`~{Q$+n+~SvTy(Z002ovPDHLkV1f@H-LwDz diff --git a/src/main/resources/assets/createnuclear/textures/block/reactor/casing/reactor_casing_connected.png b/src/main/resources/assets/createnuclear/textures/block/reactor/casing/reactor_casing_connected.png index 5f6f8ba13a51373cfdc0994527dbc68b30c145dd..b2d67db90349990593b960335f28ae1ca4978c59 100644 GIT binary patch literal 10532 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 J)o9p7{y&EuGX4Mn diff --git a/src/main/resources/assets/createnuclear/textures/block/reactor/controller/controller_panel.png b/src/main/resources/assets/createnuclear/textures/block/reactor/controller/controller_panel.png deleted file mode 100644 index 52c7d1bf0ac8c9a58f219d4fe6c7d39023c85528..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 514 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%Lhe0X`wFA;H0Mad9!x(E$Pe(NR(H@$q4yp`jrmv9YniK|yh`u>t=6ety1w zzP?kZ&+6@;R9#yi85M12ZV?m|^#A|=70Z_0zIhX9n7M^zNJy}Ofnj7sgrcHiaB$H7 zbqvwb(Gn683Gwm5!oom91A%t<`NhV>Oq(&MZ^Gn=sOSlkrWzU(e7IGran_{FZT|m^yisH7Zrj-GlO^Lq~6@vd$@?2>_DIz;*xt From 6e71c11071a0490c19a722b71281434b93c43c43 Mon Sep 17 00:00:00 2001 From: Giovanni Date: Fri, 7 Aug 2026 19:40:04 +0200 Subject: [PATCH 27/33] refactor(rod-type): change RodType to hold a single item instead of a HolderSet RodType previously stored a HolderSet so a rod type could map to multiple items; in practice each type only ever mapped to one, so the API/data model is simplified to a single Holder. - RodType: replace `items: HolderSet` with `item: Holder`, switch codec from RegistryCodecs.homogeneousList to RegistryFixedCodec, and update isNotEmptyItem()/toString()/ getTypeForItem() accordingly - RodType.Builder: replace addItems(ItemLike...) with item(ItemLike), add explicit type(TypeRod) setter, drop the redundant *Set boolean flags in favor of null checks in build(), default type to NONE - TypeRodPredicate: drop the non-level-aware IS_FUEL/IS_COOLED predicates and tag shortcuts; isFuel/isCooled now always resolve the rod type through the level's registries - ItemRodTypesValue: build DEFAULT_ROD_TYPE from Items.AIR's holder instead of an empty HolderSet, update setRodTypeInfos() to use builder.item(item) instead of addItems(item) - ReactorInputManager: switch fuel/cooler checks to the level-aware isFuel(stack, level)/isCooled(stack, level) methods - Regenerate fallback.json rod-type data to use "item": "minecraft:air" instead of "items": [] --- .../fed443662143001aeb5341375f6f5ef31d10baea | 4 +- .../createnuclear/rods/type/fallback.json | 2 +- .../createnuclear/api/ItemRodTypesValue.java | 7 +- .../api/multiblock/rods/RodType.java | 246 +++++++++--------- .../manager/ReactorInputManager.java | 8 +- .../content/multiblock/rod/CNRodTypes.java | 2 +- 6 files changed, 135 insertions(+), 134 deletions(-) diff --git a/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea b/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea index 26181ae..76dbd02 100644 --- a/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea +++ b/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea @@ -1,8 +1,8 @@ -// 1.21.1 2026-08-07T16:22:08.564305 CreateNuclear Generated Registry Entries +// 1.21.1 2026-08-07T19:35:40.5844174 CreateNuclear Generated Registry Entries aa1897ff27a6aa83e2efbee29e12ad6dab2f6a0a data/createnuclear/createnuclear/fluids/type/fallback.json d7c754aa51cea393a10bce85986c1c0c641150d5 data/createnuclear/createnuclear/fluids/type/nitrogen.json afee3d8f15bf8285e175f73befba7b46fdc94b19 data/createnuclear/createnuclear/fluids/type/water.json -706132bf26d87ed4a83f8d5f8793ab69a60b98fe data/createnuclear/createnuclear/rods/type/fallback.json +15403b1cee46d300af2247a08485c04ccd80cfc0 data/createnuclear/createnuclear/rods/type/fallback.json 74de56c37a28ab632a6ffc161475bcec85de68e2 data/createnuclear/damage_type/fan_radiation.json dfb5a22341ff4202e85ca8cdf9b6ec95c6e280d1 data/createnuclear/damage_type/radiation.json 5b42761cb26db47a6ad47ff3c84820f9fd541477 data/createnuclear/neoforge/biome_modifier/lead_ore.json diff --git a/src/generated/resources/data/createnuclear/createnuclear/rods/type/fallback.json b/src/generated/resources/data/createnuclear/createnuclear/rods/type/fallback.json index 4e42f40..57c68b4 100644 --- a/src/generated/resources/data/createnuclear/createnuclear/rods/type/fallback.json +++ b/src/generated/resources/data/createnuclear/createnuclear/rods/type/fallback.json @@ -1,7 +1,7 @@ { "type": "NONE", "baseRodHeat": -1, - "items": [], + "item": "minecraft:air", "proximityRodHeat": -1.0, "rodTimer": -1 } \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/api/ItemRodTypesValue.java b/src/main/java/net/nuclearteam/createnuclear/api/ItemRodTypesValue.java index 53355a4..e617392 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/ItemRodTypesValue.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/ItemRodTypesValue.java @@ -3,6 +3,7 @@ import com.simibubi.create.api.registry.SimpleRegistry; import com.tterrag.registrate.util.nullness.NonNullConsumer; import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; import static net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRod.NONE; @@ -16,7 +17,7 @@ public class ItemRodTypesValue { * Default RodType returned when no mapping exists in the registry. * Built once to avoid allocating a new instance on each lookup. */ - public static final RodType DEFAULT_ROD_TYPE = new RodType(HolderSet.direct(Collections.emptyList()), -1, -1, -1, NONE); + public static final RodType DEFAULT_ROD_TYPE = new RodType(Items.AIR.builtInRegistryHolder(), -1, -1, -1, NONE); /** * Get the {@link RodType} associated with the given {@link Item}. @@ -39,7 +40,7 @@ public static RodType getRodType(Item item) { * @throws NullPointerException if {@code type} is null */ public static NonNullConsumer setRodTypeInfos(RodType.Builder type) { - return item -> ROD_TYPE.register(item, type.addItems(item).build()); + return item -> ROD_TYPE.register(item, type.item(item).build()); } @@ -71,7 +72,7 @@ public static NonNullConsumer setRodTypeInfos(int baseRodHeat, int proximi } return item -> { - RodType built = builder.addItems(item).build(); + RodType built = builder.item(item).build(); ROD_TYPE.register(item, built); }; } diff --git a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/rods/RodType.java b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/rods/RodType.java index dbacc5e..bba0092 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/rods/RodType.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/rods/RodType.java @@ -8,12 +8,17 @@ import net.minecraft.core.HolderSet; import net.minecraft.core.RegistryAccess; import net.minecraft.core.RegistryCodecs; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; +import net.minecraft.resources.RegistryFixedCodec; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.StringRepresentable; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; +import net.neoforged.neoforge.registries.NeoForgeRegistries; import net.nuclearteam.createnuclear.CNTags.CNItemTags; import net.nuclearteam.createnuclear.api.CreateNuclearRegistries; import net.nuclearteam.createnuclear.api.ItemRodTypesValue; @@ -29,47 +34,40 @@ /** * Represents a rod type used by the mod's multiblock. *

- * A {@code RodType} holds a set of items that can represent this rod type, + * A {@code RodType} holds the single item that represents this rod type, * heat-related values, a timing value, and a {@link TypeRod} indicating the - * category (fuel, cooler, or none). - *

- * Every numeric value is stored as a {@link Supplier} so it can be backed by a - * live source such as a config option: the value is re-read on each accessor - * call instead of being frozen at registration time (see {@code CNItems}). + * category (fuel, cooler, or mixed). */ @MethodsReturnNonnullByDefault -public record RodType(HolderSet items, +public record RodType(Holder item, Supplier baseRodHeat, Supplier proximityRodHeat, Supplier rodTimer, Supplier ratio, TypeRod type) { - public RodType(HolderSet items, + public RodType(Holder item, int baseRodHeat, float proximityRodHeat, int rodTimer, TypeRod type) { - this(items, baseRodHeat, proximityRodHeat, rodTimer, type, 1); + this(item, baseRodHeat, proximityRodHeat, rodTimer, type, 1); } - public RodType(HolderSet items, + public RodType(Holder item, int baseRodHeat, float proximityRodHeat, int rodTimer, TypeRod type, int ratio) { - this(items, () -> baseRodHeat, () -> proximityRodHeat, () -> rodTimer, () -> ratio, type); + this(item, () -> baseRodHeat, () -> proximityRodHeat, () -> rodTimer, () -> ratio, type); } /** * Serialization codec for saving/loading {@link RodType} instances. - *

- * {@code ratio} is optional and defaults to {@code 1} so datapacks written - * before it existed keep loading unchanged. */ public static final Codec CODEC = RecordCodecBuilder.create(i -> i.group( - RegistryCodecs.homogeneousList(Registries.ITEM).fieldOf("items").forGetter(RodType::items), - Codec.INT.fieldOf("baseRodHeat").forGetter(rt -> rt.baseRodHeat().get()), - Codec.FLOAT.fieldOf("proximityRodHeat").forGetter(rt -> rt.proximityRodHeat().get()), - Codec.INT.fieldOf("rodTimer").forGetter(rt -> rt.rodTimer().get()), - StringRepresentable.fromEnum(TypeRod::values).fieldOf("type").forGetter(RodType::type), - Codec.INT.optionalFieldOf("ratio", 1).forGetter(rt -> rt.ratio().get()) + RegistryFixedCodec.create(Registries.ITEM).fieldOf("item").forGetter(RodType::item), + Codec.INT.fieldOf("baseRodHeat").forGetter(rt -> rt.baseRodHeat().get()), + Codec.FLOAT.fieldOf("proximityRodHeat").forGetter(rt -> rt.proximityRodHeat().get()), + Codec.INT.fieldOf("rodTimer").forGetter(rt -> rt.rodTimer().get()), + StringRepresentable.fromEnum(TypeRod::values).fieldOf("type").forGetter(RodType::type), + Codec.INT.optionalFieldOf("ratio", 1).forGetter(rt -> rt.ratio().get()) ).apply(i, RodType::new)); /** @@ -84,7 +82,7 @@ public RodType(HolderSet items, public static Optional> getTypeForItem(RegistryAccess registryAccess, Item item) { return registryAccess.lookupOrThrow(CreateNuclearRegistries.ROD_TYPE) .listElements() - .filter(ref -> ref.value().items.contains(item.builtInRegistryHolder())) + .filter(ref -> ref.value().item.equals(item.builtInRegistryHolder())) .findFirst(); } @@ -99,7 +97,7 @@ public static Optional> getTypeForItem(RegistryAccess registr */ public static RodType resolveRodType(Item item, Level world) { return RodType.getTypeForItem(world.registryAccess(), item) - .map(Reference::value) + .map(Holder.Reference::value) .orElseGet(() -> { RodType fromItem = ItemRodTypesValue.getRodType(item); return fromItem.isNotEmptyItem() @@ -112,44 +110,47 @@ public static RodType resolveRodType(Item item, Level world) { } /** - * Returns whether this {@code RodType} has no associated items. + * Returns whether this {@code RodType} has an associated item (i.e. is + * not the empty/sentinel item). * - * @return {@code true} if at least one item is defined, {@code false} otherwise + * @return {@code true} if a real item is defined, {@code false} otherwise */ public boolean isNotEmptyItem() { - return this.items.size() >= 1; + return this.item.value() != Items.AIR; } /** * Fluent builder for creating an immutable {@link RodType} instance. *

- * Every numeric value ({@code baseRodHeat}, {@code proximityRodHeat}, - * {@code rodTimer}, {@code ratio}) can be set either as a fixed primitive - * (evaluated once, at build time) or as a {@link Supplier} (re-evaluated on - * every call to the corresponding accessor). The primitive overloads are - * pure convenience: {@code baseRodHeat(5)} is equivalent to - * {@code baseRodHeat(() -> 5)}. Use the {@link Supplier} overloads to back a - * value with a live source such as a config option, so changes are picked up - * without rebuilding the {@code RodType}. + * Every heat/timing value ({@code baseRodHeat}, {@code proximityRodHeat}, + * {@code rodTimer}, {@code ratio}) can be set either as a fixed + * primitive (evaluated once, at build time) or as a {@link Supplier} + * (re-evaluated on every call to the corresponding {@link RodType} + * accessor). The primitive overloads are pure convenience: they simply + * wrap the given value in a constant supplier, e.g. + * {@code baseRodHeat(5)} is equivalent to {@code baseRodHeat(() -> 5)}. + * Use the {@link Supplier} overloads to back a value with a live source + * such as a config option (see {@code CNItems} for examples), so that + * changes are picked up without rebuilding the {@code RodType}. + *

+ * {@code item}, {@code type}, {@code baseRodHeat}, {@code proximityRodHeat} + * and {@code rodTimer} are required; {@code ratio} defaults to a + * constant {@code 1} and never needs to be set explicitly. Call + * {@link #build()} once all required values are configured. */ public static class Builder { - private final List> items = new ArrayList<>(); - private Supplier baseRodHeat = () -> 0; - private Supplier proximityRodHeat = () -> 0f; - private Supplier rodTimer = () -> 0; - private Supplier ratio = () -> 1; - private TypeRod type = TypeRod.FUEL; - - private boolean itemsSet = false; - private boolean baseRodHeatSet = false; - private boolean proximityRodHeatSet = false; - private boolean rodTimerSet = false; - private boolean typeSet = false; + private Holder item = null; + private Supplier baseRodHeat = null; + private Supplier proximityRodHeat = null; + private Supplier rodTimer = null; + private Supplier ratio = null; + private TypeRod type = TypeRod.NONE; /** - * Sets the base heat for the rod. + * Sets a fixed base heat value, evaluated once at build time. + * Equivalent to {@code baseRodHeat(() -> baseRodHeat)}. * - * @param baseRodHeat base heat value + * @param baseRodHeat constant base heat value * @return this builder */ public Builder baseRodHeat(int baseRodHeat) { @@ -157,43 +158,47 @@ public Builder baseRodHeat(int baseRodHeat) { } /** - * Sets the base heat for the rod, backed by a live source. + * Sets a dynamic base heat value, re-evaluated every time + * {@link RodType#baseRodHeat()} is called (e.g. to reflect a live + * config option instead of a value frozen at registration time). * - * @param baseRodHeat supplier of the base heat value + * @param baseRodHeat supplier producing the base heat value on demand * @return this builder */ public Builder baseRodHeat(Supplier baseRodHeat) { this.baseRodHeat = baseRodHeat; - this.baseRodHeatSet = true; return this; } /** - * Sets the heat contributed by nearby rods. + * Sets a fixed proximity heat value (heat contributed by nearby rods), + * evaluated once at build time. + * Equivalent to {@code proximityRodHeat(() -> proximityRodHeat)}. * - * @param proximityRodHeat proximity heat value + * @param proximityRodHeat constant proximity heat value * @return this builder */ public Builder proximityRodHeat(float proximityRodHeat) { - return proximityRodHeat(() -> proximityRodHeat); + return proximityRodHeat(() -> proximityRodHeat) ; } /** - * Sets the heat contributed by nearby rods, backed by a live source. + * Sets a dynamic proximity heat value, re-evaluated every time + * {@link RodType#proximityRodHeat()} is called. * - * @param proximityRodHeat supplier of the proximity heat value + * @param proximityRodHeat supplier producing the proximity heat value on demand * @return this builder */ public Builder proximityRodHeat(Supplier proximityRodHeat) { this.proximityRodHeat = proximityRodHeat; - this.proximityRodHeatSet = true; return this; } /** - * Sets the timer (duration) for the rod's behavior. + * Sets a fixed timer (duration) for the rod's behavior, evaluated + * once at build time. Equivalent to {@code rodTimer(() -> rodTimer)}. * - * @param rodTimer duration in ticks or mod-specific units + * @param rodTimer constant duration in ticks or mod-specific units * @return this builder */ public Builder rodTimer(int rodTimer) { @@ -201,22 +206,23 @@ public Builder rodTimer(int rodTimer) { } /** - * Sets the timer (duration) for the rod's behavior, backed by a live source. + * Sets a dynamic timer (duration) for the rod's behavior, + * re-evaluated every time {@link RodType#rodTimer()} is called. * - * @param rodTimer supplier of the duration + * @param rodTimer supplier producing the duration on demand * @return this builder */ public Builder rodTimer(Supplier rodTimer) { this.rodTimer = rodTimer; - this.rodTimerSet = true; return this; } /** - * Sets the weight this rod carries when resolving the reactor's - * fuel/cooler thermal balance (see {@code HeatBalance}). + * Sets a fixed heat ratio, evaluated once at build time. Optional: + * defaults to a constant {@code 1} if never called. + * Equivalent to {@code ratio(() -> ratio)}. * - * @param ratio weight of a single rod of this type + * @param ratio constant heat ratio value * @return this builder */ public Builder ratio(int ratio) { @@ -224,9 +230,11 @@ public Builder ratio(int ratio) { } /** - * Sets the thermal balance weight, backed by a live source. + * Sets a dynamic heat ratio, re-evaluated every time + * {@link RodType#ratio()} is called. Optional: defaults to a + * constant {@code 1} if never called. * - * @param ratio supplier of the weight + * @param ratio supplier producing the heat ratio on demand * @return this builder */ public Builder ratio(Supplier ratio) { @@ -234,15 +242,27 @@ public Builder ratio(Supplier ratio) { return this; } + /** + * Sets the rod category directly. Prefer the {@link #coolerRodType()} + * and {@link #fuelRodType()} convenience methods for the common + * cases; use this overload only to set {@link TypeRod#NONE} + * explicitly (e.g. for a fallback/sentinel rod type). + * + * @param type the rod category to assign + * @return this builder + */ + public Builder type(TypeRod type) { + this.type = type; + return this; + } + /** * Sets the rod type to {@link TypeRod#COOLER}. * * @return this builder */ public Builder coolerRodType() { - this.type = TypeRod.COOLER; - this.typeSet = true; - return this; + return type(TypeRod.COOLER); } /** @@ -251,42 +271,46 @@ public Builder coolerRodType() { * @return this builder */ public Builder fuelRodType() { - this.type = TypeRod.FUEL; - this.typeSet = true; - return this; + return type(TypeRod.FUEL); } /** - * Adds one or more items that represent this rod type. + * Sets the item that represents this rod type. Calling this again + * replaces the previously set item. * - * @param items array of {@link ItemLike} elements to associate + * @param item the item to associate with this rod type * @return this builder */ - public Builder addItems(ItemLike... items) { - for (ItemLike provider : items) - this.items.add(provider.asItem().builtInRegistryHolder()); - if (items.length > 0) this.itemsSet = true; + public Builder item(ItemLike item) { + this.item = item.asItem().builtInRegistryHolder(); return this; } /** * Builds the immutable {@link RodType} instance. + *

+ * Validates that {@code item} and {@code type}, {@code baseRodHeat}, + * {@code proximityRodHeat} and {@code rodTimer} have all been set + * (either as a fixed value or as a dynamic {@link Supplier}); + * {@code ratio} is exempt since it defaults to a constant + * {@code 1}. * - * @throws IllegalStateException if required fields are missing + * @throws IllegalStateException if one or more required fields are missing, + * naming every missing field in the exception message * @return the created instance */ public RodType build() { List missing = new ArrayList<>(); - if (!itemsSet || items.isEmpty()) missing.add("items"); - if (!typeSet) missing.add("type"); - if (!baseRodHeatSet) missing.add("baseRodHeat"); - if (!proximityRodHeatSet) missing.add("proximityRodHeat"); - if (!rodTimerSet) missing.add("rodTimer"); + if (item == null) missing.add("item"); + if (type == null) missing.add("type"); + if (baseRodHeat == null) missing.add("baseRodHeat"); + if (proximityRodHeat == null) missing.add("proximityRodHeat"); + if (rodTimer == null) missing.add("rodTimer"); if (!missing.isEmpty()) throw new IllegalStateException("Missing required RodType fields: " + String.join(", ", missing)); - return new RodType(HolderSet.direct(items), baseRodHeat, proximityRodHeat, rodTimer, ratio, type); + return new RodType(item, baseRodHeat, proximityRodHeat, rodTimer, ratio, type); } } @@ -314,51 +338,20 @@ public String getSerializedName() { public static final class TypeRodPredicate { public static final Predicate IS_NOT_NULL = Objects::nonNull; - public static final Predicate IS_FUEL = s -> { - TypeRod type = ItemRodTypesValue.getRodType(s.getItem()).type; - return IS_NOT_NULL.test(s) && (s.is(CNItemTags.FUEL.tag) || type == TypeRod.FUEL); - }; - - public static final Predicate IS_COOLED = s -> { - TypeRod type = ItemRodTypesValue.getRodType(s.getItem()).type; - return IS_NOT_NULL.test(s) && (s.is(CNItemTags.COOLER.tag) || type == TypeRod.COOLER); - }; + public static boolean isFuel(ItemStack stack, Level level) { + return IS_NOT_NULL.test(stack) && RodType.resolveRodType(stack.getItem(), level).type == TypeRod.FUEL; + } - /** @return whether the given resolved rod type is a fuel rod. */ public static boolean isFuel(RodType rodType) { return rodType != null && rodType.type() == TypeRod.FUEL; } - /** @return whether the given resolved rod type is a cooler rod. */ - public static boolean isCooled(RodType rodType) { - return rodType != null && rodType.type() == TypeRod.COOLER; - } - - /** - * Level-aware variant of {@link #IS_FUEL}: resolves the rod type through - * the world registries first, so datapack-defined rod types are honoured. - */ - public static boolean isFuel(ItemStack stack, Level level) { - if (!IS_NOT_NULL.test(stack) || stack.isEmpty()) return false; - if (stack.is(CNItemTags.FUEL.tag)) return true; - return isFuel(resolveRodType(stack.getItem(), level)); - } - - /** - * Level-aware variant of {@link #IS_COOLED}: resolves the rod type through - * the world registries first, so datapack-defined rod types are honoured. - */ public static boolean isCooled(ItemStack stack, Level level) { - if (!IS_NOT_NULL.test(stack) || stack.isEmpty()) return false; - if (stack.is(CNItemTags.COOLER.tag)) return true; - return isCooled(resolveRodType(stack.getItem(), level)); + return IS_NOT_NULL.test(stack) && RodType.resolveRodType(stack.getItem(), level).type == TypeRod.COOLER; } - public static String tooltipKey(ItemStack stack) { - if (!IS_NOT_NULL.test(stack)) return "unknown"; - if (IS_FUEL.test(stack)) return "fuel"; - if (IS_COOLED.test(stack)) return "cooled"; - return "unknown"; + public static boolean isCooled(RodType rodType) { + return rodType != null && rodType.type() == TypeRod.COOLER; } public static String tooltipKey(ItemStack stack, Level level) { @@ -371,7 +364,14 @@ public static String tooltipKey(ItemStack stack, Level level) { @Override public String toString() { - return "RodType [items: " + this.items() + + String itemName = this.item.unwrapKey() + .map(k -> k.location().toString()) + .orElseGet(() -> { + ResourceLocation rl = BuiltInRegistries.ITEM.getKey(this.item.value()); + return rl != null ? rl.toString() : this.item.value().toString(); + }); + + return "RodType [item: " + itemName + ", baseRodHeat: " + this.baseRodHeat().get() + ", proximityRodHeat: " + this.proximityRodHeat().get() + ", rodTimer: " + this.rodTimer().get() + diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputManager.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputManager.java index 653340f..75f52d3 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputManager.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputManager.java @@ -83,8 +83,8 @@ public VirtualReactorInputsItem getInventory(Level level) { for (int s = 0; s < slots; s++) { ItemStack st = h.getStackInSlot(s); - if (TypeRodPredicate.IS_FUEL.test(st)) totalFuel += st.getCount(); - else if (TypeRodPredicate.IS_COOLED.test(st)) totalCooler += st.getCount(); + if (TypeRodPredicate.isFuel(st, level)) totalFuel += st.getCount(); + else if (TypeRodPredicate.isCooled(st, level)) totalCooler += st.getCount(); } } @@ -107,11 +107,11 @@ public boolean extractItems(Level level, int fuelNeeded, int coolerNeeded) { if (stack.isEmpty()) continue; - if (fuelRemaining > 0 && TypeRodPredicate.IS_FUEL.test(stack)) { + if (fuelRemaining > 0 && TypeRodPredicate.isFuel(stack, level)) { int toExtract = Math.min(fuelRemaining, stack.getCount()); handler.extractItem(s, toExtract, false); fuelRemaining -= toExtract; - } else if (coolerRemaining > 0 && TypeRodPredicate.IS_COOLED.test(stack)) { + } else if (coolerRemaining > 0 && TypeRodPredicate.isCooled(stack, level)) { int toExtract = Math.min(coolerRemaining, stack.getCount()); handler.extractItem(s, toExtract, false); coolerRemaining -= toExtract; diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/rod/CNRodTypes.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/rod/CNRodTypes.java index 9ce48e9..0226140 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/rod/CNRodTypes.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/rod/CNRodTypes.java @@ -25,7 +25,7 @@ public class CNRodTypes { * .baseRodHeat(int) * .proximityRodHeat(int) * .rodTimer(int) - * .addItems(Item) + * .item(Item) * .fuelRodType() * .build()); * } From 4fba3eb4c8747ef64b0302969fb88eb54fbf6093 Mon Sep 17 00:00:00 2001 From: Giovanni Date: Sat, 8 Aug 2026 14:46:30 +0200 Subject: [PATCH 28/33] refactor(fluid-type): mirror RodType's single-item model onto ReactorFluidType Following the RodType refactor, apply the same "one item per type" simplification to ReactorFluidType, and centralize the fallback registry keys. - ReactorFluidType: replace `fluids: HolderSet` with `fluid: Holder`; switch codec from RegistryCodecs.homogeneousList to RegistryFixedCodec; simplify getTypeForFluid()/isNotEmptyFluid()/toString() accordingly - ReactorFluidType.Builder: single fluid(Fluid)/fluid(FluidStack) setters instead of accumulating a list; drop the unused setRodConfig()/useConfig runtime-config override in maxHeat()/ efficiency() (build() now always requires maxHeat and efficiency) - CreateNuclearRegistries: introduce FALLBACK_ROD and FALLBACK_FLUID ResourceKey constants, replacing the ones previously declared in CNRodTypes.FALLBACK and CNReactorFluidTypes.FALLBACK - CNRodTypes / CNReactorFluidTypes: remove the now-relocated FALLBACK ResourceKey fields - RodType: point resolveRodType() at CreateNuclearRegistries.FALLBACK_ROD instead of CNRodTypes.FALLBACK - ReactorFluidTypesValue: build DEFAULT_REACTOR_FLUID_TYPE from Fluids.EMPTY's holder instead of an empty HolderSet - MultiBlockManagerBeta: widen findStructure()'s parameter from the concrete ReactorControllerBlockEntity to the IMultiblockController interface - Regenerate fluid-type data (fallback.json, nitrogen.json, water.json) to use the singular "fluid" field instead of "fluids" --- .../fed443662143001aeb5341375f6f5ef31d10baea | 8 +- .../createnuclear/fluids/type/fallback.json | 2 +- .../createnuclear/fluids/type/nitrogen.json | 2 +- .../createnuclear/fluids/type/water.json | 2 +- .../api/CreateNuclearRegistries.java | 4 +- .../api/ReactorFluidTypesValue.java | 3 +- .../api/multiblock/MultiBlockManagerBeta.java | 2 +- .../multiblock/fluid/ReactorFluidType.java | 145 +++++++----------- .../api/multiblock/rods/RodType.java | 2 +- .../multiblock/fluid/CNReactorFluidTypes.java | 2 - .../content/multiblock/rod/CNRodTypes.java | 2 - 11 files changed, 71 insertions(+), 103 deletions(-) diff --git a/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea b/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea index 76dbd02..4d8e4b3 100644 --- a/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea +++ b/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea @@ -1,7 +1,7 @@ -// 1.21.1 2026-08-07T19:35:40.5844174 CreateNuclear Generated Registry Entries -aa1897ff27a6aa83e2efbee29e12ad6dab2f6a0a data/createnuclear/createnuclear/fluids/type/fallback.json -d7c754aa51cea393a10bce85986c1c0c641150d5 data/createnuclear/createnuclear/fluids/type/nitrogen.json -afee3d8f15bf8285e175f73befba7b46fdc94b19 data/createnuclear/createnuclear/fluids/type/water.json +// 1.21.1 2026-08-08T14:42:18.3436592 CreateNuclear Generated Registry Entries +46e263393c1672a180bc12b99f9e39adf22e66b5 data/createnuclear/createnuclear/fluids/type/fallback.json +2837d5ecbd5735f39c1fac545469486e09c502e0 data/createnuclear/createnuclear/fluids/type/nitrogen.json +152a58adb9f86e1c9fac62fd2095ba8413142568 data/createnuclear/createnuclear/fluids/type/water.json 15403b1cee46d300af2247a08485c04ccd80cfc0 data/createnuclear/createnuclear/rods/type/fallback.json 74de56c37a28ab632a6ffc161475bcec85de68e2 data/createnuclear/damage_type/fan_radiation.json dfb5a22341ff4202e85ca8cdf9b6ec95c6e280d1 data/createnuclear/damage_type/radiation.json diff --git a/src/generated/resources/data/createnuclear/createnuclear/fluids/type/fallback.json b/src/generated/resources/data/createnuclear/createnuclear/fluids/type/fallback.json index 4c5a3fa..ea208e2 100644 --- a/src/generated/resources/data/createnuclear/createnuclear/fluids/type/fallback.json +++ b/src/generated/resources/data/createnuclear/createnuclear/fluids/type/fallback.json @@ -1,5 +1,5 @@ { "efficiency": -1, - "fluids": [], + "fluid": "minecraft:empty", "maxHeat": -1 } \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/createnuclear/fluids/type/nitrogen.json b/src/generated/resources/data/createnuclear/createnuclear/fluids/type/nitrogen.json index 8056bad..62e15f9 100644 --- a/src/generated/resources/data/createnuclear/createnuclear/fluids/type/nitrogen.json +++ b/src/generated/resources/data/createnuclear/createnuclear/fluids/type/nitrogen.json @@ -1,5 +1,5 @@ { "efficiency": 100, - "fluids": "createnuclear:nitrogen", + "fluid": "createnuclear:nitrogen", "maxHeat": 8196 } \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/createnuclear/fluids/type/water.json b/src/generated/resources/data/createnuclear/createnuclear/fluids/type/water.json index b8ae757..5a3ff58 100644 --- a/src/generated/resources/data/createnuclear/createnuclear/fluids/type/water.json +++ b/src/generated/resources/data/createnuclear/createnuclear/fluids/type/water.json @@ -1,5 +1,5 @@ { "efficiency": 1000, - "fluids": "minecraft:water", + "fluid": "minecraft:water", "maxHeat": 2048 } \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/api/CreateNuclearRegistries.java b/src/main/java/net/nuclearteam/createnuclear/api/CreateNuclearRegistries.java index 8b2a178..c1c8c61 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/CreateNuclearRegistries.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/CreateNuclearRegistries.java @@ -6,11 +6,13 @@ import net.nuclearteam.createnuclear.api.multiblock.fluid.ReactorFluidType; import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; - public class CreateNuclearRegistries { public static final ResourceKey> ROD_TYPE = key("rods/type"); public static final ResourceKey> FLUID_TYPE = key("fluids/type"); + public static final ResourceKey FALLBACK_ROD = ResourceKey.create(CreateNuclearRegistries.ROD_TYPE, CreateNuclear.asResource("fallback")); + public static final ResourceKey FALLBACK_FLUID = ResourceKey.create(CreateNuclearRegistries.FLUID_TYPE, CreateNuclear.asResource("fallback")); + private static ResourceKey> key(String name) { return ResourceKey.createRegistryKey(CreateNuclear.asResource(name)); } diff --git a/src/main/java/net/nuclearteam/createnuclear/api/ReactorFluidTypesValue.java b/src/main/java/net/nuclearteam/createnuclear/api/ReactorFluidTypesValue.java index 67a05e4..d994f80 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/ReactorFluidTypesValue.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/ReactorFluidTypesValue.java @@ -4,6 +4,7 @@ import com.tterrag.registrate.util.nullness.NonNullConsumer; import net.minecraft.core.HolderSet; import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.Fluids; import net.nuclearteam.createnuclear.api.multiblock.fluid.ReactorFluidType; import java.util.Collections; @@ -26,7 +27,7 @@ public class ReactorFluidTypesValue { * Default {@link ReactorFluidType} returned when no mapping exists in the * registry. Constructed once to avoid allocating a new instance on each lookup. */ - public static final ReactorFluidType DEFAULT_REACTOR_FLUID_TYPE = new ReactorFluidType(HolderSet.direct(Collections.emptyList()), -1, -1); + public static final ReactorFluidType DEFAULT_REACTOR_FLUID_TYPE = new ReactorFluidType(Fluids.EMPTY.builtInRegistryHolder(), -1, -1); /** * Get the {@link ReactorFluidType} associated with the given {@link Fluid}. diff --git a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/MultiBlockManagerBeta.java b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/MultiBlockManagerBeta.java index 1cce9b9..d74b16a 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/MultiBlockManagerBeta.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/MultiBlockManagerBeta.java @@ -19,7 +19,7 @@ public void register(String id, T data, IMultiBlockPattern blockPattern) { structures.add(new BlockPattern<>(id, data, blockPattern)); } - public BlockPattern findStructure(Level level, BlockPos pos, ReactorControllerBlockEntity entity) { + public BlockPattern findStructure(Level level, BlockPos pos, IMultiblockController entity) { List directions = new ArrayList<>(); directions.add(Direction.NORTH); directions.add(Direction.WEST); diff --git a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/fluid/ReactorFluidType.java b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/fluid/ReactorFluidType.java index 97422ea..949378a 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/fluid/ReactorFluidType.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/fluid/ReactorFluidType.java @@ -9,9 +9,11 @@ import net.minecraft.core.RegistryCodecs; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; +import net.minecraft.resources.RegistryFixedCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.Fluids; import net.neoforged.neoforge.fluids.FluidStack; import net.nuclearteam.createnuclear.api.CreateNuclearRegistries; import net.nuclearteam.createnuclear.api.ReactorFluidTypesValue; @@ -23,21 +25,21 @@ import java.util.Optional; import java.util.stream.Collectors; + /** * Represents a reactor fluid type used by the mod's multiblock. *

- * A {@code ReactorFluidType} holds a set of fluids that identify this - * fluid type, heat-related and efficiency values, and a flag indicating - * whether those values should be read from configuration at runtime. + * A {@code ReactorFluidType} holds the single fluid that identifies this + * fluid type, along with its heat-related and efficiency values. */ -public record ReactorFluidType(HolderSet fluids, int maxHeat, int efficiency, boolean useConfig) { - public ReactorFluidType(HolderSet fluids, int maxHeat, int efficiency) { - this(fluids, maxHeat, efficiency, false); +public record ReactorFluidType(Holder fluid, int maxHeat, int efficiency, boolean useConfig) { + public ReactorFluidType(Holder fluid, int maxHeat, int efficiency) { + this(fluid, maxHeat, efficiency, false); } /** Serialization codec for saving/loading {@link ReactorFluidType} instances. */ public static final Codec CODEC = RecordCodecBuilder.create(i -> i.group( - RegistryCodecs.homogeneousList(Registries.FLUID).fieldOf("fluids").forGetter(ReactorFluidType::fluids), + RegistryFixedCodec.create(Registries.FLUID).fieldOf("fluid").forGetter(ReactorFluidType::fluid), Codec.INT.fieldOf("maxHeat").forGetter(ReactorFluidType::maxHeat), Codec.INT.fieldOf("efficiency").forGetter(ReactorFluidType::efficiency) ).apply(i, ReactorFluidType::new)); @@ -52,13 +54,16 @@ public ReactorFluidType(HolderSet fluids, int maxHeat, int efficiency) { * {@code ReactorFluidType} if found, otherwise {@link Optional#empty()} */ public static Optional> getTypeForFluid(RegistryAccess registryAccess, Fluid fluid) { + ResourceLocation fluidKey = BuiltInRegistries.FLUID.getKey(fluid); + if (fluidKey == null) return Optional.empty(); + return registryAccess.lookupOrThrow(CreateNuclearRegistries.FLUID_TYPE) - .listElements() - .filter(ref -> ref.value().fluids.stream() - .anyMatch(h -> h.unwrapKey() - .map(k -> Optional.ofNullable(BuiltInRegistries.FLUID.getKey(fluid)).map(k.location()::equals).orElse(false)) - .orElse(false))) - .findFirst(); + .listElements() + .filter(ref -> ref.value().fluid.unwrapKey() + .map(k -> k.location().equals(fluidKey)) + .orElse(false) + ) + .findFirst(); } /** @@ -74,26 +79,27 @@ public static Optional> getTypeForFluid(RegistryAcce */ public static ReactorFluidType resolveReactorFluidType(Fluid fluid, Level world) { return ReactorFluidType.getTypeForFluid(world.registryAccess(), fluid) - .map(Reference::value) - .orElseGet(() -> { - ReactorFluidType fromFluid = ReactorFluidTypesValue.getReactorFluidType(fluid); - return fromFluid.isNotEmptyFluid() - ? fromFluid - : world.registryAccess() - .registryOrThrow(CreateNuclearRegistries.FLUID_TYPE) - .getHolderOrThrow(CNReactorFluidTypes.FALLBACK) - .value(); - }); + .map(Reference::value) + .orElseGet(() -> { + ReactorFluidType fromFluid = ReactorFluidTypesValue.getReactorFluidType(fluid); + return fromFluid.isNotEmptyFluid() + ? fromFluid + : world.registryAccess() + .registryOrThrow(CreateNuclearRegistries.FLUID_TYPE) + .getHolderOrThrow(CreateNuclearRegistries.FALLBACK_FLUID) + .value(); + }); } /** - * Returns whether this {@code ReactorFluidType} has at least one associated fluid. + * Returns whether this {@code ReactorFluidType} has an associated fluid + * (i.e. is not the empty/sentinel fluid). * - * @return {@code true} if one or more fluids are defined, {@code false} otherwise + * @return {@code true} if a real fluid is defined, {@code false} otherwise */ public boolean isNotEmptyFluid() { - return this.fluids.size() >= 1; + return this.fluid.value() != Fluids.EMPTY; } /** @@ -103,12 +109,9 @@ public boolean isNotEmptyFluid() { * resulting instance. */ public static class Builder { - private final List> fluids = new ArrayList<>(); + private Holder fluid = null; private int maxHeat = 0; private int efficiency = 0; - private boolean useConfig = false; - - private boolean fluidSet = false; private boolean maxHeatSet = false; private boolean efficiencySet = false; @@ -137,93 +140,59 @@ public Builder efficiency(int efficiency) { } /** - * Adds a fluid to this type from a {@link FluidStack}. + * Sets the fluid identifying this type from a {@link FluidStack}. * * @param fluidStack the fluid stack providing the fluid * @return this builder */ public Builder fluid(FluidStack fluidStack) { - this.fluids.add(fluidStack.getFluid().builtInRegistryHolder()); - this.fluidSet = true; - return this; + return fluid(fluidStack.getFluid()); } /** - * Adds a fluid to this type directly. + * Sets the fluid identifying this type. Calling this again replaces + * the previously set fluid. * - * @param fluid the fluid to add + * @param fluid the fluid to associate with this type * @return this builder */ public Builder fluid(Fluid fluid) { - this.fluids.add(fluid.builtInRegistryHolder()); - this.fluidSet = true; - return this; - } - - /** - * Marks this type to resolve numeric values from configuration at runtime. - * - * @return this builder - */ - public Builder setRodConfig() { - this.useConfig = true; + this.fluid = fluid.builtInRegistryHolder(); return this; } /** * Builds the immutable {@link ReactorFluidType} instance. * - * @throws IllegalStateException if required fields are missing * @return the created instance + * @throws IllegalStateException if required fields are missing */ public ReactorFluidType build() { List missing = new ArrayList<>(); - if (!fluidSet || fluids.isEmpty()) missing.add("fluids"); - - if (!this.useConfig) { - if (!maxHeatSet) missing.add("maxHeat"); - if (!efficiencySet) missing.add("efficiency"); - } + if (fluid == null) missing.add("fluid"); + if (!maxHeatSet) missing.add("maxHeat"); + if (!efficiencySet) missing.add("efficiency"); if (!missing.isEmpty()) - throw new IllegalStateException("Missing required RodType fields: " + String.join(", ", missing)); - - return new ReactorFluidType(HolderSet.direct(fluids), maxHeat, efficiency, useConfig); - } - } - - @Override - public int maxHeat() { - if (!useConfig) return maxHeat; - try { - return 12; //CNConfigs.server().rods.maxHeat.get(); - } catch (IllegalStateException e) { - return maxHeat; - } - } + throw new IllegalStateException("Missing required ReactorFluidType fields: " + String.join(", ", missing)); - @Override - public int efficiency() { - if (!useConfig) return efficiency; - try { - return 12; //CNConfigs.server().rods.maxHeat.get(); - } catch (IllegalStateException e) { - return efficiency; + return new ReactorFluidType(fluid, maxHeat, efficiency); } } @Override public @NotNull String toString() { - String fluidNames = this.fluids.stream() - .map(h -> h.unwrapKey() - .map(k -> k.location().toString()) - .orElseGet(() -> { - ResourceLocation rl = BuiltInRegistries.FLUID.getKey(h.value()); - return rl != null ? rl.toString() : h.value().toString(); - }) - ) - .collect(Collectors.joining(", ")); - - return "ReactorFluidType{fluids=[" + fluidNames + "], maxHeat=" + maxHeat() + ", efficiency=" + efficiency() + "}"; + String fluidNames = this.fluid.unwrapKey() + .map(k -> k.location().toString()) + .orElseGet(() -> { + ResourceLocation rl = BuiltInRegistries.FLUID.getKey(this.fluid.value()); + return rl != null ? rl.toString() : this.fluid.value().toString(); + }); + + return "ReactorFluidType{" + + "fluids=[" + fluidNames + "]," + + "maxHeat=" + maxHeat() + "," + + "efficiency=" + efficiency() + + "}"; } } diff --git a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/rods/RodType.java b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/rods/RodType.java index bba0092..93d74f8 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/rods/RodType.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/rods/RodType.java @@ -104,7 +104,7 @@ public static RodType resolveRodType(Item item, Level world) { ? fromItem : world.registryAccess() .registryOrThrow(CreateNuclearRegistries.ROD_TYPE) - .getHolderOrThrow(CNRodTypes.FALLBACK) + .getHolderOrThrow(CreateNuclearRegistries.FALLBACK_ROD) .value(); }); } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/fluid/CNReactorFluidTypes.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/fluid/CNReactorFluidTypes.java index d2ced40..6dac564 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/fluid/CNReactorFluidTypes.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/fluid/CNReactorFluidTypes.java @@ -11,8 +11,6 @@ import static net.nuclearteam.createnuclear.api.ReactorFluidTypesValue.DEFAULT_REACTOR_FLUID_TYPE; public class CNReactorFluidTypes { - public static final ResourceKey FALLBACK = ResourceKey.create(CreateNuclearRegistries.FLUID_TYPE, CreateNuclear.asResource("fallback")); - /** * Static registry of reactor fluid types ({@link ReactorFluidType}) for the CreateNuclear mod. * diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/rod/CNRodTypes.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/rod/CNRodTypes.java index 0226140..5a7a478 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/rod/CNRodTypes.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/rod/CNRodTypes.java @@ -9,8 +9,6 @@ import static net.nuclearteam.createnuclear.api.ItemRodTypesValue.DEFAULT_ROD_TYPE; public class CNRodTypes { - public static final ResourceKey FALLBACK = ResourceKey.create(CreateNuclearRegistries.ROD_TYPE, CreateNuclear.asResource("fallback")); - /** * Static registry of rod types ({@code RodType}) for the CreateNuclear mod. * From c25ca35a413f0cadc8eb334607e24e0912761c18 Mon Sep 17 00:00:00 2001 From: Giovanni Date: Sat, 8 Aug 2026 14:50:12 +0200 Subject: [PATCH 29/33] fix(radiation): subscribe RadiationCapability's event bus on the default bus @EventBusSubscriber previously pinned the class to the GAME bus explicitly; switch to the default bus argument so the class's listeners register on NeoForge's default mod event bus instead. - RadiationCapability: drop `bus = EventBusSubscriber.Bus.GAME` from the @EventBusSubscriber annotation, keeping only `modid` --- .../content/radiation/capability/RadiationCapability.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/RadiationCapability.java b/src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/RadiationCapability.java index ddcb30e..de6d816 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/RadiationCapability.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/RadiationCapability.java @@ -38,7 +38,7 @@ import java.util.Set; import java.util.function.Supplier; -@EventBusSubscriber(modid = CreateNuclear.MOD_ID, bus = EventBusSubscriber.Bus.GAME) +@EventBusSubscriber(modid = CreateNuclear.MOD_ID) public class RadiationCapability implements INBTSerializable { public static final DeferredRegister> ATTACHMENT_TYPES = DeferredRegister.create(NeoForgeRegistries.Keys.ATTACHMENT_TYPES, CreateNuclear.MOD_ID); // serializable(), not builder(): builder() attaches no serializer, so the state was never From 41f617675f073ec1cb0e21c285d96be069a5f6db Mon Sep 17 00:00:00 2001 From: Giovanni Date: Sat, 8 Aug 2026 16:25:58 +0200 Subject: [PATCH 30/33] refactor(recipe-gen): move EnrichedRecipeGen/SnowPowderRecipeGen from foundation to the api package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Relocate the addon-facing recipe generator base classes into the `api.data.recipe` package (mirroring how other API surfaces of the mod are organized), restore EnrichedRecipeGen's full StandardProcessingRecipeGen implementation, and wire up the new camera/renderer client mixins for the radiation-effect rendering hook. Staged: - Move SnowPowderRecipeGen from foundation/data/recipe → api/data/recipe (package updated) - Delete the old foundation/data/recipe/EnrichedRecipeGen.java (now superseded by the moved/rewritten api/data/recipe/EnrichedRecipeGen.java) Not staged: - EnrichedRecipeGen (api): extend StandardProcessingRecipeGen again instead of the raw ProcessingRecipeGen, restoring the convert(...) helper methods, CNRecipeTypes.ENRICHED wiring, and class-level Javadoc pointing at CNEnrichedRecipeGen/CNRecipeProvider - CNEnrichedRecipeGen / CNSnowPowderRecipeGen: update imports to reference the relocated api.data.recipe base classes - CNRecipeProvider: drop now-unused imports (Create, ProcessingRecipe, ProcessingRecipeBuilder, CreateRecipeProvider, IRecipeTypeInfo, CatnipServices, ResourceLocation, Ingredient, ItemLike, CreateNuclear, Supplier, UnaryOperator) left over from the recipe gen cleanup - createnuclear.neoforge.mixins.json: register the two new client mixins, client.CameraAccessor and client.GameRendererMixin, alongside the existing RadiationHeartMixin and AntiRadiationArmorTextureMixin - PARITE_FORGE_NEOFORGE.md: update the Forge→NeoForge parity notes — mark CriterionTriggerBase as resolved (now tracks Create's own evolution instead of vanilla SimpleCriterionTrigger), note that the Alex's Caves compat hook doesn't apply since that mod isn't available on 1.21.1, and note that comparing mixins.json is mandatory given Minecraft's internal changes between 1.20.1 and 1.21.1 Untracked (new files, not yet staged): - compat/Mods.java and compat/alexscave/AlexscaveCompat.java: initial mod-compat scaffolding (mod-loaded checks and an Alex's Caves compatibility handler) - foundation/mixin/client/CameraAccessor.java and foundation/mixin/client/GameRendererMixin.java: new client mixins backing the mixins.json registration above, for camera/renderer access per the radiation-effect rendering parity notes --- PARITE_FORGE_NEOFORGE.md | 6 +- .../api/data/recipe/EnrichedRecipeGen.java | 25 +++++- .../data/recipe/SnowPowderRecipeGen.java | 2 +- .../createnuclear/compat/Mods.java | 86 +++++++++++++++++++ .../compat/alexscave/AlexscaveCompat.java | 66 ++++++++++++++ .../data/recipe/CNEnrichedRecipeGen.java | 1 + .../data/recipe/CNRecipeProvider.java | 13 --- .../data/recipe/CNSnowPowderRecipeGen.java | 1 + .../data/recipe/EnrichedRecipeGen.java | 44 ---------- .../mixin/client/CameraAccessor.java | 12 +++ .../mixin/client/GameRendererMixin.java | 42 +++++++++ .../createnuclear.neoforge.mixins.json | 4 +- 12 files changed, 240 insertions(+), 62 deletions(-) rename src/main/java/net/nuclearteam/createnuclear/{foundation => api}/data/recipe/SnowPowderRecipeGen.java (96%) create mode 100644 src/main/java/net/nuclearteam/createnuclear/compat/Mods.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/compat/alexscave/AlexscaveCompat.java delete mode 100644 src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/EnrichedRecipeGen.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/CameraAccessor.java create mode 100644 src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/GameRendererMixin.java diff --git a/PARITE_FORGE_NEOFORGE.md b/PARITE_FORGE_NEOFORGE.md index bd6a6cd..bdc63fa 100644 --- a/PARITE_FORGE_NEOFORGE.md +++ b/PARITE_FORGE_NEOFORGE.md @@ -47,7 +47,7 @@ d'un diff d'arborescence — et c'est là qu'ont été trouvés la moitié des b |---|---| | `content/radiation/capability/IRadiationCapability` | **Data attachments NeoForge** — `RadiationCapability` expose `AttachmentType RADIATION`, lu via `entity.getData(RADIATION)` | | `content/radiation/capability/RadiationProvider` | idem — la plomberie `ICapabilityProvider` de Forge n'a pas d'équivalent, ni de raison d'exister | -| `foundation/advancement/CriterionTriggerBase` | **`SimpleCriterionTrigger` vanilla** — `SimpleCreateNuclearTrigger` en hérite directement | +| `foundation/advancement/CriterionTriggerBase` | ~~**`SimpleCriterionTrigger` vanilla** — `SimpleCreateNuclearTrigger` en hérite directement~~ Suivre Create donc modification du code par rapport au maj de Create | | `foundation/utility/SimplexNoise` | **`net.minecraft.world.level.levelgen.synth.SimplexNoise`** — `Maths` utilise déjà celui de vanilla | ### 1.2 Présents sous un autre nom ou dans un autre package @@ -102,6 +102,8 @@ qui fonctionnent aujourd'hui — à faire avec un test en jeu de chaque animal. **Point d'accroche.** `NuclearExplosionEntity` côté Forge : +le mod n'existe pas vraiment en 1.21.1 + ```java if (Mods.ALEXS_CAVE.isLoaded()) { this.alexscaveHandler = new AlexscaveCompat(); @@ -126,7 +128,7 @@ de l'explosion (accès à la caméra + hook sur le `GameRenderer`). NeoForge a à la place `AntiRadiationArmorTextureMixin`, qui n'existe pas côté Forge : les deux versions ont donc **divergé sur les mixins client**. Comparer les deux `createnuclear.mixins.json` -avant de porter. +avant de porter.: obligatoir etant donnée le fonctionnement de minecraft a changé entre la 1.20.1 et la 1.21.1 **Difficulté : moyenne.** Les mixins sont sensibles aux versions et cassent silencieusement. À porter avec un test visuel explicite. diff --git a/src/main/java/net/nuclearteam/createnuclear/api/data/recipe/EnrichedRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/api/data/recipe/EnrichedRecipeGen.java index 73402df..6b2b031 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/data/recipe/EnrichedRecipeGen.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/data/recipe/EnrichedRecipeGen.java @@ -1,14 +1,37 @@ package net.nuclearteam.createnuclear.api.data.recipe; import com.simibubi.create.api.data.recipe.ProcessingRecipeGen; +import com.simibubi.create.api.data.recipe.StandardProcessingRecipeGen; import com.simibubi.create.foundation.recipe.IRecipeTypeInfo; +import net.createmod.catnip.registry.RegisteredObjectsHelper; import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.ItemLike; import net.nuclearteam.createnuclear.CNRecipeTypes; +import net.nuclearteam.createnuclear.content.kinetics.fan.processing.EnrichedRecipe; import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; -public abstract class EnrichedRecipeGen extends ProcessingRecipeGen { +/** + * The base class for Haunting recipe generation. + * Addons should extend this and use the {@link ProcessingRecipeGen#create} methods + * or the helper methods contained in this class to make recipes. + * For an example of how you might do this, see {@link net.nuclearteam.createnuclear.foundation.data.recipe.CNEnrichedRecipeGen}. + * Needs to be added to a registered recipe provider to do anything, see {@link net.nuclearteam.createnuclear.foundation.data.recipe.CNRecipeProvider} + */ +public abstract class EnrichedRecipeGen extends StandardProcessingRecipeGen { + public GeneratedRecipe convert(ItemLike input, ItemLike result) { + return convert(() -> Ingredient.of(input), () -> result); + } + + public GeneratedRecipe convert(Supplier input, Supplier result) { + return create(asResource(RegisteredObjectsHelper.getKeyOrThrow(result.get().asItem()) + .getPath()), + p -> p.withItemIngredients(input.get()) + .output(result.get())); + } public EnrichedRecipeGen(PackOutput generator, CompletableFuture registries, String defaultNamespace) { super(generator, registries, defaultNamespace); diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/SnowPowderRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/api/data/recipe/SnowPowderRecipeGen.java similarity index 96% rename from src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/SnowPowderRecipeGen.java rename to src/main/java/net/nuclearteam/createnuclear/api/data/recipe/SnowPowderRecipeGen.java index 41038d9..ee1f66e 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/SnowPowderRecipeGen.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/data/recipe/SnowPowderRecipeGen.java @@ -1,4 +1,4 @@ -package net.nuclearteam.createnuclear.foundation.data.recipe; +package net.nuclearteam.createnuclear.api.data.recipe; import com.simibubi.create.api.data.recipe.ProcessingRecipeGen; import com.simibubi.create.api.data.recipe.StandardProcessingRecipeGen; diff --git a/src/main/java/net/nuclearteam/createnuclear/compat/Mods.java b/src/main/java/net/nuclearteam/createnuclear/compat/Mods.java new file mode 100644 index 0000000..cba6eec --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/compat/Mods.java @@ -0,0 +1,86 @@ +package net.nuclearteam.createnuclear.compat; + +import net.createmod.catnip.lang.Lang; +import net.createmod.catnip.registry.RegisteredObjectsHelper; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; +import net.neoforged.fml.loading.LoadingModList; + +import java.util.Optional; +import java.util.function.Supplier; + +public enum Mods { + ALEXS_CAVE("alexscaves") + ; + + private final String id; + private final boolean isLoaded; + + Mods(String name) { + id = Lang.asId(name); + isLoaded = LoadingModList.get().getModFileById(id) != null; + } + + Mods() { + id = Lang.asId(name()); + isLoaded = LoadingModList.get().getModFileById(id) != null; + } + + public String id() { + return id; + } + + public ResourceLocation rl(String path) { + return ResourceLocation.fromNamespaceAndPath(id, path); + } + + public Block getBlock(String id) { + return BuiltInRegistries.BLOCK.get(rl(id)); + } + + public Item getItem(String id) { + return BuiltInRegistries.ITEM.get(rl(id)); + } + + public boolean contains(ItemLike entry) { + if (!isLoaded()) + return false; + Item asItem = entry.asItem(); + return asItem != null && RegisteredObjectsHelper.getKeyOrThrow(asItem) + .getNamespace() + .equals(id); + } + + /** + * @return a boolean of whether the mod is loaded or not based on mod id + */ + public boolean isLoaded() { + return isLoaded; + } + + /** + * Simple hook to run code if a mod is installed + * + * @param toRun will be run only if the mod is loaded + * @return Optional.empty() if the mod is not loaded, otherwise an Optional of the return value of the given supplier + */ + public Optional runIfInstalled(Supplier> toRun) { + if (isLoaded()) + return Optional.of(toRun.get().get()); + return Optional.empty(); + } + + /** + * Simple hook to execute code if a mod is installed + * + * @param toExecute will be executed only if the mod is loaded + */ + public void executeIfInstalled(Supplier toExecute) { + if (isLoaded()) { + toExecute.get().run(); + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/compat/alexscave/AlexscaveCompat.java b/src/main/java/net/nuclearteam/createnuclear/compat/alexscave/AlexscaveCompat.java new file mode 100644 index 0000000..3fa1d95 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/compat/alexscave/AlexscaveCompat.java @@ -0,0 +1,66 @@ +package net.nuclearteam.createnuclear.compat.alexscave; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; + +/** + * The mod doesn't exist for 1.21.1. + */ +public class AlexscaveCompat { + public AlexscaveCompat() {} + + public boolean MobSpawn(BlockState state, Level level, BlockPos.MutableBlockPos carve, float itemDropModifier, Explosion dummyExplosion){ +// if(state.is(ACBlockRegistry.TREMORZILLA_EGG.get()) && state.getBlock() instanceof TremorzillaEggBlock tremorzillaEggBlock){ +// tremorzillaEggBlock.spawnDinosaurs(level, carve, state); +// return true; +// } +// else if (AlexsCaves.COMMON_CONFIG.nukesSpawnItemDrops.get() && random.nextFloat() < itemDropModifier && state.getFluidState().isEmpty()) { +// level.destroyBlock(carve, true); +// } else { +// state.onBlockExploded(level, carve, dummyExplosion); +// } + return false; + } + +// public boolean isRaycat(LivingEntity entity) { +// return entity instanceof RaycatEntity; +// } +// +// public boolean isTremorzilla(LivingEntity entity){ +// return entity instanceof TremorzillaEntity; +// } +// +// public boolean ACResConfig(){ +// return AlexsCaves.COMMON_CONFIG.nukeMaxBlockExplosionResistance.get() <= 0; +// } + +// public boolean ACDestroyable(BlockState state) { +// return !state.is(ACTagRegistry.NUKE_PROOF) && +// (state.getBlock().getExplosionResistance() < AlexsCaves.COMMON_CONFIG.nukeMaxBlockExplosionResistance.get() +// || state.is(ACBlockRegistry.TREMORZILLA_EGG.get())); +// } + + public void NukeParam() { +// ((ClientProxy) AlexsCaves.PROXY).renderNukeSkyDarkFor = 70; +// ((ClientProxy) AlexsCaves.PROXY).muteNonNukeSoundsFor = 50; + } + +// public SoundEvent[] GetACSounds(){ +// return new SoundEvent[] { +// ACSoundRegistry.LARGE_NUCLEAR_EXPLOSION.get(), +// ACSoundRegistry.NUCLEAR_EXPLOSION.get(), +// ACSoundRegistry.NUCLEAR_EXPLOSION_RINGING.get(), +// ACSoundRegistry.NUCLEAR_EXPLOSION_RUMBLE.get() +// }; +// } + +// public boolean GetACConfig(){ +// return AlexsCaves.CLIENT_CONFIG.nuclearBombFlash.get(); +// } + + public void UpdateACProxy() { +// ((ClientProxy) AlexsCaves.PROXY).renderNukeFlashFor = 16; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNEnrichedRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNEnrichedRecipeGen.java index cfa8df7..b271401 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNEnrichedRecipeGen.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNEnrichedRecipeGen.java @@ -7,6 +7,7 @@ import net.nuclearteam.createnuclear.CNBlocks; import net.nuclearteam.createnuclear.CNItems; import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.api.data.recipe.EnrichedRecipeGen; import java.util.concurrent.CompletableFuture; diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNRecipeProvider.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNRecipeProvider.java index 0baa55b..87ff76f 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNRecipeProvider.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNRecipeProvider.java @@ -1,12 +1,6 @@ package net.nuclearteam.createnuclear.foundation.data.recipe; -import com.simibubi.create.Create; import com.simibubi.create.api.data.recipe.ProcessingRecipeGen; -import com.simibubi.create.content.processing.recipe.ProcessingRecipe; -import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder; -import com.simibubi.create.foundation.data.recipe.CreateRecipeProvider; -import com.simibubi.create.foundation.recipe.IRecipeTypeInfo; -import net.createmod.catnip.platform.CatnipServices; import net.minecraft.core.HolderLookup; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; @@ -14,16 +8,10 @@ import net.minecraft.data.PackOutput; import net.minecraft.data.recipes.RecipeOutput; import net.minecraft.data.recipes.RecipeProvider; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.level.ItemLike; -import net.nuclearteam.createnuclear.CreateNuclear; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; -import java.util.function.Supplier; -import java.util.function.UnaryOperator; public abstract class CNRecipeProvider extends RecipeProvider { @@ -48,7 +36,6 @@ public static void registerAllProcessing(DataGenerator gen, PackOutput output, C GENERATORS.add(new CNWashingRecipeGen(output, registries)); GENERATORS.add(new CNDeployingRecipeGen(output, registries)); - gen.addProvider(true, new DataProvider() { @Override diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNSnowPowderRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNSnowPowderRecipeGen.java index 8ce03bb..627600d 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNSnowPowderRecipeGen.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNSnowPowderRecipeGen.java @@ -4,6 +4,7 @@ import net.minecraft.data.PackOutput; import net.nuclearteam.createnuclear.CNItems; import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.api.data.recipe.SnowPowderRecipeGen; import java.util.concurrent.CompletableFuture; diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/EnrichedRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/EnrichedRecipeGen.java deleted file mode 100644 index 8600de4..0000000 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/EnrichedRecipeGen.java +++ /dev/null @@ -1,44 +0,0 @@ -package net.nuclearteam.createnuclear.foundation.data.recipe; - -import com.simibubi.create.api.data.recipe.ProcessingRecipeGen; -import com.simibubi.create.api.data.recipe.StandardProcessingRecipeGen; -import com.simibubi.create.foundation.recipe.IRecipeTypeInfo; -import net.createmod.catnip.registry.RegisteredObjectsHelper; -import net.minecraft.core.HolderLookup; -import net.minecraft.data.PackOutput; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.level.ItemLike; -import net.nuclearteam.createnuclear.CNRecipeTypes; -import net.nuclearteam.createnuclear.content.kinetics.fan.processing.EnrichedRecipe; - -import java.util.concurrent.CompletableFuture; -import java.util.function.Supplier; - -/** - * The base class for Haunting recipe generation. - * Addons should extend this and use the {@link ProcessingRecipeGen#create} methods - * or the helper methods contained in this class to make recipes. - * For an example of how you might do this, see Create's implementation: {@link net.nuclearteam.createnuclear.foundation.data.recipe.CNEnrichedRecipeGen}. - * Needs to be added to a registered recipe provider to do anything, see {@link net.nuclearteam.createnuclear.foundation.data.recipe.CNRecipeProvider} - */ -public abstract class EnrichedRecipeGen extends StandardProcessingRecipeGen { - public GeneratedRecipe convert(ItemLike input, ItemLike result) { - return convert(() -> Ingredient.of(input), () -> result); - } - - public GeneratedRecipe convert(Supplier input, Supplier result) { - return create(asResource(RegisteredObjectsHelper.getKeyOrThrow(result.get().asItem()) - .getPath()), - p -> p.withItemIngredients(input.get()) - .output(result.get())); - } - - public EnrichedRecipeGen(PackOutput output, CompletableFuture registries, String defaultNamespace) { - super(output, registries, defaultNamespace); - } - - @Override - protected CNRecipeTypes getRecipeType() { - return CNRecipeTypes.ENRICHED; - } -} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/CameraAccessor.java b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/CameraAccessor.java new file mode 100644 index 0000000..38ca04e --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/CameraAccessor.java @@ -0,0 +1,12 @@ +package net.nuclearteam.createnuclear.foundation.mixin.client; + +import net.minecraft.client.Camera; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(Camera.class) +public interface CameraAccessor { + // Exposes the private Camera#move so it can be called from outside the class + @Invoker("move") + void callMove(double distanceOffset, double verticalOffset, double horizontalOffset); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/GameRendererMixin.java b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/GameRendererMixin.java new file mode 100644 index 0000000..d170cb8 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/GameRendererMixin.java @@ -0,0 +1,42 @@ +package net.nuclearteam.createnuclear.foundation.mixin.client; + +import net.minecraft.client.renderer.GameRenderer; +import net.nuclearteam.createnuclear.CNClientProxy; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(GameRenderer.class) +public abstract class GameRendererMixin { + + @Shadow + private float darkenWorldAmount; + + // Handles darkening the sky/world during a nuclear explosion + @Inject( + method = {"Lnet/minecraft/client/renderer/GameRenderer;tick()V"}, + remap = true, + at = @At(value = "TAIL") + ) + public void CN$tick(CallbackInfo ci) { + if (CNClientProxy.renderNukeSkyDarkFor > 0 && darkenWorldAmount < 1.0F) { + darkenWorldAmount = Math.min(darkenWorldAmount + 0.3F, 1.0F); + } + } + + // Triggers the white flash render (preScreenRender) + @Inject( + method = {"Lnet/minecraft/client/renderer/GameRenderer;render(FJZ)V"}, + remap = true, + at = @At( + value = "INVOKE", + target = "Lcom/mojang/blaze3d/platform/Lighting;setupFor3DItems()V", + shift = At.Shift.AFTER + ) + ) + public void CN$render(float partialTick, long nanos, boolean idk, CallbackInfo ci) { + CNClientProxy.preScreenRender(partialTick); + } +} diff --git a/src/main/resources/createnuclear.neoforge.mixins.json b/src/main/resources/createnuclear.neoforge.mixins.json index 9add340..95c1b01 100644 --- a/src/main/resources/createnuclear.neoforge.mixins.json +++ b/src/main/resources/createnuclear.neoforge.mixins.json @@ -10,7 +10,9 @@ ], "client": [ "client.RadiationHeartMixin", - "client.AntiRadiationArmorTextureMixin" + "client.AntiRadiationArmorTextureMixin", + "client.CameraAccessor", + "client.GameRendererMixin" ], "injectors": { "defaultRequire": 1 From 34189d7476a81703784da8133683a86767071bc0 Mon Sep 17 00:00:00 2001 From: Giovanni Date: Sat, 8 Aug 2026 17:55:11 +0200 Subject: [PATCH 31/33] feat(radiation): route radiation damage through RadiationCapability's dose/contagion model Radiation damage sources (campfire, fan enriching, the RADIATION mob effect) previously applied the effect/damage directly; they now go through RadiationCapability's dose-based contagion system, and the fan_radiation damage type (previously commented out) is wired up and tagged as NO_KNOCKBACK alongside RADIATION. - RadiationEffect: extend the new VicinityEffect base instead of MobEffect directly, adding a contagion radius/duration and an onContaminate(...) hook that calls RadiationCapability.applyContagion(...) on nearby entities; applyEffectTick() now defers to super, computes damage from RadiationCapability.getRadiationResistance(...), and deals it via CNDamageSources.radiation(...) instead of livingEntity.damageSources().magic() - EnrichingCampfireBlock: entityInside() now calls RadiationCapability.applyContagion(livingEntity, CAMPFIRE_DOSE, 100) instead of directly adding a RADIATION MobEffectInstance - CNFanProcessingTypes.EnrichedType: affectEntity() now applies a contagion dose via RadiationCapability.applyContagion(...) and separately deals 1 point of fan_radiation damage via CNDamageSources.fanRadiation(level), instead of only adding a RADIATION MobEffectInstance - CNDamageSources: un-comment and enable fanRadiation(Level), which was previously dead code - CNDamageTypes: clean up radiation(Level) to use imported DamageSource/ Level types instead of fully-qualified names (no behavior change) - Add CNDamageTypeTagsProvider: a plain TagsProvider (not a Registrate dynamic tag generator, since DamageType entries only resolve through the datapack-registry HolderLookup.Provider) tagging RADIATION and FAN_RADIATION under DamageTypeTags.NO_KNOCKBACK - CreateNuclearDatagen: register the new CNDamageTypeTagsProvider as a server data provider - CameraAccessor: widen callMove(...)'s parameters from double to float, matching the updated Camera#move signature - GameRendererMixin: update the @Inject target from the old render(FJZ)V signature to the current render(Lnet/minecraft/client/DeltaTracker;Z)V signature, and read the partial tick via deltaTracker.getGameTimeDeltaPartialTick(false) instead of a raw float parameter --- run/command_history.txt | 11 ++++ .../2448df8ffe5180e3e6870fcd493b0e61d5ed7ce8 | 2 + .../tags/damage_type/no_knockback.json | 6 ++ .../createnuclear/CNDamageTypes.java | 6 +- .../campfire/EnrichingCampfireBlock.java | 7 +- .../fan/processing/CNFanProcessingTypes.java | 6 +- .../content/radiation/RadiationEffect.java | 64 +++++++++++-------- .../damageTypes/CNDamageSources.java | 4 +- .../mixin/client/CameraAccessor.java | 2 +- .../mixin/client/GameRendererMixin.java | 7 +- .../data/CNDamageTypeTagsProvider.java | 36 +++++++++++ .../data/CreateNuclearDatagen.java | 1 + 12 files changed, 115 insertions(+), 37 deletions(-) create mode 100644 src/generated/resources/.cache/2448df8ffe5180e3e6870fcd493b0e61d5ed7ce8 create mode 100644 src/generated/resources/data/minecraft/tags/damage_type/no_knockback.json create mode 100644 src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CNDamageTypeTagsProvider.java diff --git a/run/command_history.txt b/run/command_history.txt index 79227d8..d62be35 100644 --- a/run/command_history.txt +++ b/run/command_history.txt @@ -32,3 +32,14 @@ /time set day /gamemode spectator /gamemode creative +/effect give Dev createnuclear:iodine +/effect give Dev createnuclear:radiation +/time set day +/effect clear Dev +/effect give Dev createnuclear:radiation +/effect give Dev createnuclear:radiation 30000 +/effect give Dev minecraft:regeneration infinite 255 true +/effect give Dev createnuclear:radiation +/effect give Dev createnuclear:radiation infinite +/effect give Dev minecraft:saturation infinite 255 true +/effect give Dev createnuclear:radiation infinite diff --git a/src/generated/resources/.cache/2448df8ffe5180e3e6870fcd493b0e61d5ed7ce8 b/src/generated/resources/.cache/2448df8ffe5180e3e6870fcd493b0e61d5ed7ce8 new file mode 100644 index 0000000..d26aab4 --- /dev/null +++ b/src/generated/resources/.cache/2448df8ffe5180e3e6870fcd493b0e61d5ed7ce8 @@ -0,0 +1,2 @@ +// 1.21.1 2026-08-08T17:51:45.3883913 CreateNuclear Damage Type Tags +be715fe45426c240c8e1dd1b8c5fa096f8453d88 data/minecraft/tags/damage_type/no_knockback.json diff --git a/src/generated/resources/data/minecraft/tags/damage_type/no_knockback.json b/src/generated/resources/data/minecraft/tags/damage_type/no_knockback.json new file mode 100644 index 0000000..b2aff4f --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/damage_type/no_knockback.json @@ -0,0 +1,6 @@ +{ + "values": [ + "createnuclear:radiation", + "createnuclear:fan_radiation" + ] +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/CNDamageTypes.java b/src/main/java/net/nuclearteam/createnuclear/CNDamageTypes.java index 1a85f91..6cf5252 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNDamageTypes.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNDamageTypes.java @@ -3,7 +3,9 @@ import net.minecraft.core.registries.Registries; import net.minecraft.data.worldgen.BootstrapContext; import net.minecraft.resources.ResourceKey; +import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.damagesource.DamageType; +import net.minecraft.world.level.Level; @SuppressWarnings("unused") public class CNDamageTypes { @@ -14,8 +16,8 @@ private static ResourceKey key(String name) { public static final ResourceKey RADIATION = key("radiation"); public static final ResourceKey FAN_RADIATION = key("fan_radiation"); - public static net.minecraft.world.damagesource.DamageSource radiation(net.minecraft.world.level.Level level) { - return new net.minecraft.world.damagesource.DamageSource(level.registryAccess().registryOrThrow(Registries.DAMAGE_TYPE).getHolderOrThrow(RADIATION)); + public static DamageSource radiation(Level level) { + return new DamageSource(level.registryAccess().registryOrThrow(Registries.DAMAGE_TYPE).getHolderOrThrow(RADIATION)); } public static void bootstrap(BootstrapContext ctx) { diff --git a/src/main/java/net/nuclearteam/createnuclear/content/enriching/campfire/EnrichingCampfireBlock.java b/src/main/java/net/nuclearteam/createnuclear/content/enriching/campfire/EnrichingCampfireBlock.java index b76720a..880fc58 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/enriching/campfire/EnrichingCampfireBlock.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/enriching/campfire/EnrichingCampfireBlock.java @@ -44,6 +44,7 @@ import net.minecraft.world.phys.shapes.VoxelShape; import net.nuclearteam.createnuclear.CNBlockEntityTypes; import net.nuclearteam.createnuclear.CNEffects; +import net.nuclearteam.createnuclear.content.radiation.capability.RadiationCapability; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -52,6 +53,8 @@ @ParametersAreNonnullByDefault @SuppressWarnings({"deprecation", "unused"}) public class EnrichingCampfireBlock extends BaseEntityBlock implements SimpleWaterloggedBlock, IBE { + private static final double CAMPFIRE_DOSE = 5.0D; + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( (enrichChampFireBlock) -> enrichChampFireBlock @@ -84,8 +87,8 @@ protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Lev @Override public void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) { - if (state.getValue(LIT) && entity instanceof LivingEntity) { - ((LivingEntity) entity).addEffect(new MobEffectInstance(CNEffects.RADIATION.getDelegate(), 100, 0)); + if (state.getValue(LIT) && entity instanceof LivingEntity livingEntity) { + RadiationCapability.applyContagion(livingEntity, CAMPFIRE_DOSE, 100); } super.entityInside(state, level, pos, entity); } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/kinetics/fan/processing/CNFanProcessingTypes.java b/src/main/java/net/nuclearteam/createnuclear/content/kinetics/fan/processing/CNFanProcessingTypes.java index 64b1ac5..2b3b47d 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/kinetics/fan/processing/CNFanProcessingTypes.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/kinetics/fan/processing/CNFanProcessingTypes.java @@ -24,6 +24,8 @@ import net.minecraft.world.phys.Vec3; import net.nuclearteam.createnuclear.*; import net.nuclearteam.createnuclear.content.enriching.campfire.EnrichingCampfireBlock; +import net.nuclearteam.createnuclear.content.radiation.capability.RadiationCapability; +import net.nuclearteam.createnuclear.foundation.damageTypes.CNDamageSources; import javax.annotation.Nullable; import java.util.List; @@ -65,6 +67,7 @@ public static FanProcessingType parseLegacy(String str) { } public static class EnrichedType implements FanProcessingType { + private static final double FAN_ENRICHING_DOSE = 5.0D; @Override public boolean isValidAt(Level level, BlockPos pos) { @@ -118,7 +121,8 @@ public void morphAirFlow(AirFlowParticleAccess particleAccess, RandomSource rand @Override public void affectEntity(Entity entity, Level level) { if (entity instanceof LivingEntity livingEntity) { - livingEntity.addEffect(new MobEffectInstance(CNEffects.RADIATION.getDelegate(), 10, 0, true, true)); + RadiationCapability.applyContagion(livingEntity, FAN_ENRICHING_DOSE, 10); + livingEntity.hurt(CNDamageSources.fanRadiation(level), 1); } } } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationEffect.java b/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationEffect.java index fec1b43..0a86039 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationEffect.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationEffect.java @@ -7,30 +7,53 @@ import net.nuclearteam.createnuclear.CNEffects; import net.nuclearteam.createnuclear.CNTags; import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.content.effects.VicinityEffect; import net.nuclearteam.createnuclear.content.radiation.capability.RadiationCapability; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.nuclearteam.createnuclear.foundation.damageTypes.CNDamageSources; -public class RadiationEffect extends MobEffect { +public class RadiationEffect extends VicinityEffect { + private static final int CONTAGION_DURATION_TICKS = 300; /** * Constructs the RadiationEffect with harmful category and color. * Also applies attribute modifiers to reduce speed, attack damage, and attack speed. */ public RadiationEffect() { - super(MobEffectCategory.HARMFUL, 15453236); // Custom color (hex value) + super(MobEffectCategory.HARMFUL, 15453236, + amplifier -> 10, + RadiationCapability::canBeIrradiated, + timer -> {}); // Custom color (hex value) // Reduces movement speed by 20% - this.addAttributeModifier(Attributes.MOVEMENT_SPEED, - ResourceLocation.fromNamespaceAndPath(CreateNuclear.MOD_ID, "radiation_movement_speed"), -0.2D, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL); + this.addAttributeModifier( + Attributes.MOVEMENT_SPEED, + ResourceLocation.fromNamespaceAndPath(CreateNuclear.MOD_ID, "radiation_movement_speed"), + -0.2D, + AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL + ); // Reduces attack damage by 20% - this.addAttributeModifier(Attributes.ATTACK_DAMAGE, - ResourceLocation.fromNamespaceAndPath(CreateNuclear.MOD_ID, "radiation_attack_damage"), -0.2D, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL); + this.addAttributeModifier( + Attributes.ATTACK_DAMAGE, + ResourceLocation.fromNamespaceAndPath(CreateNuclear.MOD_ID, "radiation_attack_damage"), + -0.2D, + AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL + ); // Reduces attack speed by 20% - this.addAttributeModifier(Attributes.ATTACK_SPEED, - ResourceLocation.fromNamespaceAndPath(CreateNuclear.MOD_ID, "radiation_attack_speed"), -0.2D, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL); + this.addAttributeModifier( + Attributes.ATTACK_SPEED, + ResourceLocation.fromNamespaceAndPath(CreateNuclear.MOD_ID, "radiation_attack_speed"), + -0.2D, + AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL + ); + } + + @Override + protected void onContaminate(LivingEntity nearby) { + RadiationCapability.applyContagion(nearby, 15D, CONTAGION_DURATION_TICKS); } /** @@ -44,27 +67,16 @@ public RadiationEffect() { */ @Override public boolean applyEffectTick(LivingEntity livingEntity, int amplifier) { - // If the entity is immune to radiation, remove the effect - if (livingEntity.getType().is(CNTags.CNEntityTags.IRRADIATED_IMMUNE.tag)) { - livingEntity.removeEffect(CNEffects.RADIATION); - return true; - } + super.applyEffectTick(livingEntity, amplifier); + + double resistance = RadiationCapability.getRadiationResistance(livingEntity); - // Full irradiated resistance (anti-radiation armor, iodine, ...) cancels the effect entirely, - // whatever its source (radiation dose, potion, explosion). - if (RadiationCapability.getRadiationResistance(livingEntity) >= 1.0) { - livingEntity.removeEffect(CNEffects.RADIATION); - return true; + float damage = (float) ((1 << amplifier) * (1.0 - resistance)); + + if (damage > 0f) { + livingEntity.hurt(CNDamageSources.radiation(livingEntity.level()), damage); } - // Apply radiation damage (magic type), scaled by amplifier - int damage = 1 << amplifier; - livingEntity.hurt(livingEntity.damageSources().magic(), damage); return true; } - - @Override - public boolean shouldApplyEffectTickThisTick(int duration, int amplifier) { - return duration >= 1; - } } \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/damageTypes/CNDamageSources.java b/src/main/java/net/nuclearteam/createnuclear/foundation/damageTypes/CNDamageSources.java index fc84815..96b9761 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/damageTypes/CNDamageSources.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/damageTypes/CNDamageSources.java @@ -16,9 +16,9 @@ public class CNDamageSources { public static DamageSource radiation(Level level) { return source(CNDamageTypes.RADIATION, level); } - /*public static DamageSource fanRadiation(Level level) { + public static DamageSource fanRadiation(Level level) { return source(CNDamageTypes.FAN_RADIATION, level); - }*/ + } private static DamageSource source(ResourceKey key, LevelReader level) { Registry registry = level.registryAccess().registryOrThrow(Registries.DAMAGE_TYPE); diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/CameraAccessor.java b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/CameraAccessor.java index 38ca04e..fed57d9 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/CameraAccessor.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/CameraAccessor.java @@ -8,5 +8,5 @@ public interface CameraAccessor { // Exposes the private Camera#move so it can be called from outside the class @Invoker("move") - void callMove(double distanceOffset, double verticalOffset, double horizontalOffset); + void callMove(float distanceOffset, float verticalOffset, float horizontalOffset); } diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/GameRendererMixin.java b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/GameRendererMixin.java index d170cb8..4e4b1b6 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/GameRendererMixin.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/GameRendererMixin.java @@ -1,5 +1,6 @@ package net.nuclearteam.createnuclear.foundation.mixin.client; +import net.minecraft.client.DeltaTracker; import net.minecraft.client.renderer.GameRenderer; import net.nuclearteam.createnuclear.CNClientProxy; import org.spongepowered.asm.mixin.Mixin; @@ -28,7 +29,7 @@ public abstract class GameRendererMixin { // Triggers the white flash render (preScreenRender) @Inject( - method = {"Lnet/minecraft/client/renderer/GameRenderer;render(FJZ)V"}, + method = {"Lnet/minecraft/client/renderer/GameRenderer;render(Lnet/minecraft/client/DeltaTracker;Z)V"}, remap = true, at = @At( value = "INVOKE", @@ -36,7 +37,7 @@ public abstract class GameRendererMixin { shift = At.Shift.AFTER ) ) - public void CN$render(float partialTick, long nanos, boolean idk, CallbackInfo ci) { - CNClientProxy.preScreenRender(partialTick); + public void CN$render(DeltaTracker deltaTracker, boolean renderLevel, CallbackInfo ci) { + CNClientProxy.preScreenRender(deltaTracker.getGameTimeDeltaPartialTick(false)); } } diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CNDamageTypeTagsProvider.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CNDamageTypeTagsProvider.java new file mode 100644 index 0000000..a56e86f --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CNDamageTypeTagsProvider.java @@ -0,0 +1,36 @@ +package net.nuclearteam.createnuclear.infrastructure.data; + +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.PackOutput; +import net.minecraft.data.tags.TagsProvider; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.world.damagesource.DamageType; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import net.nuclearteam.createnuclear.CNDamageTypes; +import net.nuclearteam.createnuclear.CreateNuclear; + +import java.util.concurrent.CompletableFuture; + +// DamageType is a datapack registry: our entries (CNDamageTypes) only exist in the enriched +// HolderLookup.Provider produced by GeneratedEntriesProvider, not in Registrate's own lookup +// provider. That's why this is a plain TagsProvider wired manually in CreateNuclearDatagen, +// instead of a Registrate dynamic tag generator (which would fail validation, missing references). +public class CNDamageTypeTagsProvider extends TagsProvider { + public CNDamageTypeTagsProvider(PackOutput output, CompletableFuture lookupProvider, ExistingFileHelper existingFileHelper) { + super(output, Registries.DAMAGE_TYPE, lookupProvider, CreateNuclear.MOD_ID, existingFileHelper); + } + + @Override + protected void addTags(HolderLookup.Provider provider) { + tag(DamageTypeTags.NO_KNOCKBACK) + .add(CNDamageTypes.RADIATION) + .add(CNDamageTypes.FAN_RADIATION) + ; + } + + @Override + public String getName() { + return "CreateNuclear Damage Type Tags"; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CreateNuclearDatagen.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CreateNuclearDatagen.java index 77fab59..ea2a4d6 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CreateNuclearDatagen.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CreateNuclearDatagen.java @@ -53,6 +53,7 @@ public static void gatherData(GatherDataEvent event) { generator.addProvider(event.includeServer(), new CNAdvancement(output, lookupProvider)); generator.addProvider(event.includeClient(), CNSoundEvents.provider(generator)); + generator.addProvider(event.includeServer(), new CNDamageTypeTagsProvider(output, lookupProvider, existingFileHelper)); if (event.includeServer()) { CNRecipeProvider.registerAllProcessing(generator, output, lookupProvider); From 0c259fc0005ea6eeb7c6159abe468bc4e4864e2c Mon Sep 17 00:00:00 2001 From: Giovanni Date: Sun, 9 Aug 2026 19:44:19 +0200 Subject: [PATCH 32/33] fix(blueprint): classify reactor blueprint rods via RodType instead of item tags MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reactor blueprints filtered pattern slots by whether a stack carried the CNItemTags.COOLER/FUEL item tag; a rod registered as fuel/cooler purely through RodType.Builder (without also being tagged, e.g. the new thorium rod) would silently vanish from the pattern when the blueprint screen was reopened. Switch classification to RodType.TypeRodPredicate.isFuel/isCooled (the level-aware resolver), and clean up the now-dead packet-based sync path and config duplication this change exposed. - ReactorBluePrintMenu: classify pattern slots using TypeRodPredicate.isFuel(stack, level)/isCooled(stack, level) instead of stack.is(CNItemTags.COOLER/FUEL.tag), in both initAndReadInventory() and saveData(); extract the 57-slot pattern grid coordinates into a shared static POSITIONS field (previously duplicated three times across initAndReadInventory(), addPatternSlots(), and saveData()); drop the unused heat/timer/ rod-count/progress/sendUpdate fields left over from the old packet sync; add getReactorBluePrintData(); switch rod-lifetime lookups from CNConfigs.common() to CNConfigs.server(), matching CRods' move to the server config (see below) - CNItems: tag the thorium rod with CNItemTags.FUEL.tag in addition to the forge "rods" tag, so it participates correctly - Regenerate data/createnuclear/tags/item/fuel.json to include createnuclear:thorium_rod - Delete ReactorBluePrintItemPacket.java: the blueprint screen synced heat/timer/rod-count fields to the server via a dedicated packet, but nothing read those fields anymore once RodType-based classification replaced them; remove the CONFIGURE_REACTOR_PATTERN entry from CNPackets accordingly - ReactorBluePrintItemScreen: remove the dead containerTick() code that read the removed CNDataComponents.PATTERN component and sent it via the now-deleted ReactorBluePrintItemPacket - ReactorBluePrintItem: add hover tooltip text explaining the item's action; shift+right-click now sends a clickable wiki link in chat instead of opening the same menu as a plain right-click - CNDataComponents: remove the now-unused PATTERN, URANIUM_TIME, GRAPHITE_TIME, COUNT_GRAPHITE_ROD and COUNT_URANIUM_ROD component types (superseded by REACTOR_BLUE_PRINT_DATA) - Delete the stray debug file content/multiblock/bluePrintItem/test.txt - CNCCommon: drop the `rods` (CRods) and `explode` (CExplode) nested configs — rods now live only under the server config (CNCServer), and explode had no real content ("Explose: pas d'idée") - CRods: move to being registered under the server config only (getName() "Rods" → "rods"); rename config keys to consistent snake_case (e.g. "Uranium rod lifespan" → "uranium_rod_lifetime_ticks", "Graphite rod lifespan" → "graphite_rod_lifetime_ticks"); update/ add comments; remove the unused maxHeat/hintHeat config and comments - CNCServer: capitalize getName() ("server" → "Server"); drop the unused `explode` comment; minor comment text tweaks - CNConfigs: drop the explicit `bus = EventBusSubscriber.Bus.MOD` on @EventBusSubscriber, relying on the default mod bus - CNotify / CRadiation: whitespace/indentation cleanup only --- .../35ba5b194a3aa18fb27424c32b9e16e01b900a51 | 4 +- .../data/createnuclear/tags/item/fuel.json | 3 +- .../createnuclear/CNDataComponents.java | 25 --- .../nuclearteam/createnuclear/CNItems.java | 2 +- .../nuclearteam/createnuclear/CNPackets.java | 3 - .../bluePrintItem/ReactorBluePrintItem.java | 44 +++-- .../ReactorBluePrintItemPacket.java | 62 ------- .../ReactorBluePrintItemScreen.java | 18 -- .../bluePrintItem/ReactorBluePrintMenu.java | 166 ++++++++---------- .../content/multiblock/bluePrintItem/test.txt | 16 -- .../infrastructure/config/CNCCommon.java | 6 +- .../infrastructure/config/CNCServer.java | 7 +- .../infrastructure/config/CNConfigs.java | 2 +- .../infrastructure/config/CNotify.java | 1 - .../infrastructure/config/CRadiation.java | 20 +-- .../infrastructure/config/CRods.java | 16 +- 16 files changed, 136 insertions(+), 259 deletions(-) delete mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItemPacket.java delete mode 100644 src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/test.txt diff --git a/src/generated/resources/.cache/35ba5b194a3aa18fb27424c32b9e16e01b900a51 b/src/generated/resources/.cache/35ba5b194a3aa18fb27424c32b9e16e01b900a51 index 0be618d..3130b83 100644 --- a/src/generated/resources/.cache/35ba5b194a3aa18fb27424c32b9e16e01b900a51 +++ b/src/generated/resources/.cache/35ba5b194a3aa18fb27424c32b9e16e01b900a51 @@ -1,4 +1,4 @@ -// 1.21.1 2026-08-07T17:41:15.0506966 Registrate Provider for createnuclear [Registries, Data Maps, Recipes, Advancements, Loot Tables, Tags (blocks), Tags (enchantments), Tags (items), Tags (fluids), Tags (entity_types), generic_server_provider, Blockstates, Item models, Lang (en_us/en_ud), generic_client_provider] +// 1.21.1 2026-08-09T19:21:32.7561765 Registrate Provider for createnuclear [Registries, Data Maps, Recipes, Advancements, Loot Tables, Tags (blocks), Tags (enchantments), Tags (items), Tags (fluids), Tags (entity_types), generic_server_provider, Blockstates, Item models, Lang (en_us/en_ud), generic_client_provider] 0b2c76c9cff305eacfdfb57c4b703f94ca6dc903 assets/createnuclear/blockstates/autunite.json 5d06bc544bcbeb7443178d66955bb5101cf696da assets/createnuclear/blockstates/autunite_pillar.json 5b375444ac5057e63776f4991589c57824574b4a assets/createnuclear/blockstates/cut_autunite.json @@ -619,7 +619,7 @@ bce34f53cb2d00f7dee84683e8fdd429dabbcc1d data/createnuclear/tags/item/anti_radia 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/createnuclear/tags/item/anti_radiation_helmet_full_dye.json 2e4d08932c4a84863f0198eb2845f80d8fda1221 data/createnuclear/tags/item/cloth.json 8e6598f14a72a61cbe1e5ed2aaea229fb2dd74e6 data/createnuclear/tags/item/cooler.json -c5587bb72c54f59e9f9a4cd2c3e6bedb78ee198d data/createnuclear/tags/item/fuel.json +d534438c9314e8b014bf1796060dd801f4ef4d4e data/createnuclear/tags/item/fuel.json 925cb97bc13b3122fe17e59ff3ec2fe4d1eaacd5 data/createnuclear/tags/item/lead_ores.json 53e435b1776a11737c64eac604fda6cd48acfc4e data/createnuclear/tags/item/stone_types/autunite.json baae2dfd7e19770072d6261ec68ce157a32be80c data/createnuclear/tags/item/thorium_ores.json diff --git a/src/generated/resources/data/createnuclear/tags/item/fuel.json b/src/generated/resources/data/createnuclear/tags/item/fuel.json index 951757d..9efea37 100644 --- a/src/generated/resources/data/createnuclear/tags/item/fuel.json +++ b/src/generated/resources/data/createnuclear/tags/item/fuel.json @@ -1,5 +1,6 @@ { "values": [ - "createnuclear:uranium_rod" + "createnuclear:uranium_rod", + "createnuclear:thorium_rod" ] } \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/CNDataComponents.java b/src/main/java/net/nuclearteam/createnuclear/CNDataComponents.java index 3726a65..533e14c 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNDataComponents.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNDataComponents.java @@ -45,31 +45,6 @@ public class CNDataComponents { builder -> builder.persistent(ReactorBluePrintData.CODEC).networkSynchronized(ReactorBluePrintData.STREAM_CODEC) ); - public static final DataComponentType PATTERN = register( - "pattern", - builder -> builder.persistent(CompoundTag.CODEC).networkSynchronized(ByteBufCodecs.COMPOUND_TAG) - ); - - public static final DataComponentType URANIUM_TIME = register( - "uranium_time", - builder -> builder.persistent(ExtraCodecs.NON_NEGATIVE_INT).networkSynchronized(ByteBufCodecs.INT) - ); - - public static final DataComponentType GRAPHITE_TIME = register( - "graphite_time", - builder -> builder.persistent(ExtraCodecs.NON_NEGATIVE_INT).networkSynchronized(ByteBufCodecs.INT) - ); - - public static final DataComponentType COUNT_GRAPHITE_ROD = register( - "count_graphite_rod", - builder -> builder.persistent(ExtraCodecs.NON_NEGATIVE_INT).networkSynchronized(ByteBufCodecs.INT) - ); - - public static final DataComponentType COUNT_URANIUM_ROD = register( - "count_uranium_rod", - builder -> builder.persistent(ExtraCodecs.NON_NEGATIVE_INT).networkSynchronized(ByteBufCodecs.INT) - ); - public static final DataComponentType CLOTH_COLOR = register( "cloth_color", b -> b.persistent(StringRepresentable.fromEnum(Cloths::values)).networkSynchronized(NeoForgeStreamCodecs.enumCodec(Cloths.class)) diff --git a/src/main/java/net/nuclearteam/createnuclear/CNItems.java b/src/main/java/net/nuclearteam/createnuclear/CNItems.java index 6d0c86e..426e45e 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNItems.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNItems.java @@ -198,7 +198,7 @@ public class CNItems { .rodTimer(() -> CNConfigs.server().rods.thoriumRodLifetime.get()) .ratio(() -> CNConfigs.server().rods.thoriumHeatRatio.get()) .fuelRodType())) - .tag(CNTags.forgeItemTag("rods")) + .tag(CNTags.forgeItemTag("rods"), CNItemTags.FUEL.tag) .register(), NITRATE = CreateNuclear.REGISTRATE diff --git a/src/main/java/net/nuclearteam/createnuclear/CNPackets.java b/src/main/java/net/nuclearteam/createnuclear/CNPackets.java index 7543248..1fabb25 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNPackets.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNPackets.java @@ -6,14 +6,11 @@ import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintItemPacket; import net.nuclearteam.createnuclear.content.multiblock.controller.EventTriggerPacket; import java.util.Locale; public enum CNPackets implements BasePacketPayload.PacketTypeProvider { - CONFIGURE_REACTOR_PATTERN(ReactorBluePrintItemPacket.class, ReactorBluePrintItemPacket.STREAM_CODEC), - // To client TRIGGER_EVENT_TEXT_OVERLAY(EventTriggerPacket.class, EventTriggerPacket.STREAM_CODEC), ; diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItem.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItem.java index 956f447..38debf8 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItem.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItem.java @@ -1,10 +1,10 @@ package net.nuclearteam.createnuclear.content.multiblock.bluePrintItem; -import com.simibubi.create.AllDataComponents; -import com.simibubi.create.foundation.item.ItemHelper; +import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -15,16 +15,15 @@ import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.neoforged.neoforge.items.ItemStackHandler; -import net.nuclearteam.createnuclear.CNDamageTypes; import net.nuclearteam.createnuclear.CNDataComponents; import net.nuclearteam.createnuclear.CNItems; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; -import java.util.Arrays; import java.util.List; @ParametersAreNonnullByDefault @@ -35,6 +34,19 @@ public ReactorBluePrintItem(Properties properties) { super(properties); } + + @Override + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { + super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); + + tooltipComponents.add(Component.translatable("item.createnuclear.reactor_blueprint.tooltip") + .withStyle(ChatFormatting.GRAY)); + + // Adjust the tooltip text to hint at the available action + tooltipComponents.add(Component.translatable("item.createnuclear.reactor_blueprint.tooltip_hint") + .withStyle(ChatFormatting.DARK_GRAY)); + } + @Override public Component getDisplayName() { return Component.translatable("reactor.item.gui.name"); @@ -57,18 +69,26 @@ public InteractionResult useOn(UseOnContext context) { public InteractionResultHolder use(Level world, Player player, InteractionHand hand) { ItemStack heldItem = player.getItemInHand(hand); + // Plain right-click -> Opens the Blueprint screen if (!player.isShiftKeyDown() && hand == InteractionHand.MAIN_HAND) { if (!world.isClientSide && player instanceof ServerPlayer) - player.openMenu(this, buf -> { - ItemStack.STREAM_CODEC.encode(buf, heldItem); - }); + player.openMenu(this, buf -> ItemStack.STREAM_CODEC.encode(buf, heldItem)); return InteractionResultHolder.success(heldItem); } + // Shift + right-click -> Sends a clickable link in chat! else if (player.isShiftKeyDown() && hand == InteractionHand.MAIN_HAND) { - if (!world.isClientSide && player instanceof ServerPlayer) { - player.openMenu(this, buf -> { - ItemStack.STREAM_CODEC.encode(buf, heldItem); - }); + if (!world.isClientSide) { + MutableComponent message = Component.translatable("item.createnuclear.reactor_blueprint.chat_info") + .withStyle(ChatFormatting.GREEN) + .append(" ") + .append(Component.translatable("item.createnuclear.reactor_blueprint.wiki_link") + .withStyle(style -> style + .withColor(ChatFormatting.AQUA) + .withUnderlined(true) + .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://wiki.createnuclear.net/")) + )); + + player.sendSystemMessage(message); } return InteractionResultHolder.success(heldItem); } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItemPacket.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItemPacket.java deleted file mode 100644 index 7e163d7..0000000 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItemPacket.java +++ /dev/null @@ -1,62 +0,0 @@ -package net.nuclearteam.createnuclear.content.multiblock.bluePrintItem; - -import io.netty.buffer.ByteBuf; -import net.createmod.catnip.codecs.stream.CatnipStreamCodecBuilders; -import net.createmod.catnip.codecs.stream.CatnipStreamCodecs; -import net.createmod.catnip.net.base.ServerboundPacketPayload; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.codec.ByteBufCodecs; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.server.level.ServerPlayer; -import net.nuclearteam.createnuclear.CNPackets; -import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; - -public record ReactorBluePrintItemPacket(CompoundTag tag, float heat, int graphiteTime, int uraniumTime, int countGraphiteRod, int countUraniumRod) implements ServerboundPacketPayload { - - public static final StreamCodec STREAM_CODEC = StreamCodec.composite( - ByteBufCodecs.COMPOUND_TAG, ReactorBluePrintItemPacket::tag, - ByteBufCodecs.FLOAT, ReactorBluePrintItemPacket::heat, - ByteBufCodecs.INT, ReactorBluePrintItemPacket::graphiteTime, - ByteBufCodecs.INT, ReactorBluePrintItemPacket::uraniumTime, - ByteBufCodecs.INT, ReactorBluePrintItemPacket::countGraphiteRod, - ByteBufCodecs.INT, ReactorBluePrintItemPacket::countUraniumRod, - ReactorBluePrintItemPacket::new - ); - - @Override - public PacketTypeProvider getTypeProvider() { - return CNPackets.CONFIGURE_REACTOR_PATTERN; - } - - @Override - public void handle(ServerPlayer player) { - if (player.containerMenu instanceof ReactorBluePrintMenu c) { - // On crée directement le state et on l’applique - this.applyState(new ReactorState( - this.countUraniumRod, - this.countGraphiteRod, - this.graphiteTime, - this.uraniumTime, - this.heat - ), c); - } - } - - public record ReactorState( - int countUraniumRod, - int countGraphiteRod, - int graphiteTime, - int uraniumTime, - float heat - ) {} - - public void applyState(ReactorState state, ReactorBluePrintMenu c) { - c.countUraniumRod = state.countUraniumRod(); - c.countGraphiteRod = state.countGraphiteRod(); - c.graphiteTime = state.graphiteTime(); - c.uraniumTime = state.uraniumTime(); - c.heat = state.heat(); - c.sendUpdate = true; - } - -} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItemScreen.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItemScreen.java index 47e4960..0ad678c 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItemScreen.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItemScreen.java @@ -52,23 +52,5 @@ protected void containerTick() { if (!ItemStack.matches(menu.player.getMainHandItem(), menu.contentHolder)) { menu.player.closeContainer(); } - - float coef = 0.1F; - - CompoundTag tag = menu.contentHolder.getOrDefault(CNDataComponents.PATTERN, new CompoundTag()); - - sendValueUpdate(tag, coef, - tag.getInt("graphiteTime"), - tag.getInt("uraniumTime"), - tag.getInt("countUraniumRod"), - tag.getInt("countGraphiteRod")+3 - ); - - - } - - - private static void sendValueUpdate(CompoundTag tag, float heat, int graphiteTime, int uraniumTime, int countGraphiteRod, int countUraniumRod) { - CatnipServices.NETWORK.sendToServer(new ReactorBluePrintItemPacket(tag, heat, graphiteTime, uraniumTime, countGraphiteRod, countGraphiteRod)); } } \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintMenu.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintMenu.java index e823ecd..143d528 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintMenu.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintMenu.java @@ -8,28 +8,36 @@ import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.items.ItemStackHandler; import net.neoforged.neoforge.items.SlotItemHandler; import net.nuclearteam.createnuclear.*; -import net.nuclearteam.createnuclear.CNTags.CNItemTags; -import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; -import net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRod; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRodPredicate; import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; import static net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintItem.getItemStorage; public class ReactorBluePrintMenu extends GhostItemMenu { - public float heat = 0F; - public int graphiteTime = 5000; - public int uraniumTime = 3600; - public int countGraphiteRod = 0; - public int countUraniumRod = 0; - public double progress = 0; - - public boolean sendUpdate = false; + /** + * Grid position of each of the 57 pattern slots, index-matched to {@link PatternData#slot()} + * and to {@code DefaultHeatCalculator#FORMATTED_PATTERN} — the reactor's proximity-heat + * calculation resolves neighbours by this exact index, so the array must never be reordered + * or resized independently of that grid. + */ + private static final int[][] POSITIONS = { + {3, 0}, {4, 0}, {5, 0}, + {2, 1}, {3, 1}, {4, 1}, {5, 1}, {6, 1}, + {1, 2}, {2, 2}, {3, 2}, {4, 2}, {5, 2}, {6, 2}, {7, 2}, + {0, 3}, {1, 3}, {2, 3}, {3, 3}, {4, 3}, {5, 3}, {6, 3}, {7, 3}, {8, 3}, + {0, 4}, {1, 4}, {2, 4}, {3, 4}, {4, 4}, {5, 4}, {6, 4}, {7, 4}, {8, 4}, + {0, 5}, {1, 5}, {2, 5}, {3, 5}, {4, 5}, {5, 5}, {6, 5}, {7, 5}, {8, 5}, + {1, 6}, {2, 6}, {3, 6}, {4, 6}, {5, 6}, {6, 6}, {7, 6}, + {2, 7}, {3, 7}, {4, 7}, {5, 7}, {6, 7}, + {3, 8}, {4, 8}, {5, 8} + }; private ReactorBluePrintData reactorBluePrintData; @@ -45,6 +53,10 @@ public static ReactorBluePrintMenu create(int id, Inventory inv, ItemStack stack return new ReactorBluePrintMenu(CNMenus.REACTOR_BLUEPRINT_MENU.get(), id, inv, stack); } + public ReactorBluePrintData getReactorBluePrintData() { + return reactorBluePrintData; + } + @Override protected boolean allowRepeats() { return false; @@ -53,35 +65,31 @@ protected boolean allowRepeats() { @Override protected void initAndReadInventory(ItemStack contentHolder) { super.initAndReadInventory(contentHolder); - int[][] positions = { - {3, 0}, {4, 0}, {5, 0}, - {2, 1}, {3, 1}, {4, 1}, {5, 1}, {6, 1}, - {1, 2}, {2, 2}, {3, 2}, {4, 2}, {5, 2}, {6, 2}, {7, 2}, - {0, 3}, {1, 3}, {2, 3}, {3, 3}, {4, 3}, {5, 3}, {6, 3}, {7, 3}, {8, 3}, - {0, 4}, {1, 4}, {2, 4}, {3, 4}, {4, 4}, {5, 4}, {6, 4}, {7, 4}, {8, 4}, - {0, 5}, {1, 5}, {2, 5}, {3, 5}, {4, 5}, {5, 5}, {6, 5}, {7, 5}, {8, 5}, - {1, 6}, {2, 6}, {3, 6}, {4, 6}, {5, 6}, {6, 6}, {7, 6}, - {2, 7}, {3, 7}, {4, 7}, {5, 7}, {6, 7}, - {3, 8}, {4, 8}, {5, 8} - }; - - - PatternData[] patternData = new PatternData[positions.length]; - ItemStack defaultStack = new ItemStack(Items.GLASS_PANE); - - for (int i = 0; i < positions.length; i++) { - patternData[i] = new PatternData(i, defaultStack); - } - - ReactorBluePrintData defaultPattern = new ReactorBluePrintData(0, 0, CNConfigs.common().rods.graphiteRodLifetime.get(), CNConfigs.common().rods.uraniumRodLifetime.get(), patternData, patternData); - reactorBluePrintData = contentHolder.getOrDefault(CNDataComponents.REACTOR_BLUE_PRINT_DATA, defaultPattern); + ItemStack glassPane = new ItemStack(Items.GLASS_PANE); + PatternData[] emptyPattern = new PatternData[POSITIONS.length]; + for (int i = 0; i < emptyPattern.length; i++) { + emptyPattern[i] = new PatternData(i, glassPane); + } - for (int i = 0; i < positions.length; i++) { - ItemStack stack = reactorBluePrintData.pattern()[i].stack().is(CNItemTags.COOLER.tag) || reactorBluePrintData.pattern()[i].stack().is(CNItemTags.FUEL.tag) - ? reactorBluePrintData.pattern()[i].stack() - : ItemStack.EMPTY; - ghostInventory.setStackInSlot(i, stack); + ReactorBluePrintData defaultData = new ReactorBluePrintData( + 0, 0, + CNConfigs.server().rods.graphiteRodLifetime.get(), + CNConfigs.server().rods.uraniumRodLifetime.get(), + emptyPattern, emptyPattern + ); + reactorBluePrintData = contentHolder.getOrDefault(CNDataComponents.REACTOR_BLUE_PRINT_DATA, defaultData); + + // Classified via RodType, not via the CNItemTags.COOLER/FUEL item tags: a rod can be + // registered as fuel/cooler through RodType.Builder without also carrying the matching + // item tag (e.g. the thorium rod), which made saved rods vanish on reopen when this used + // to filter on the tags instead. + Level level = playerInventory.player.level(); + PatternData[] pattern = reactorBluePrintData.pattern(); + for (int i = 0; i < POSITIONS.length; i++) { + ItemStack stack = pattern[i].stack(); + boolean isRod = TypeRodPredicate.isFuel(stack, level) || TypeRodPredicate.isCooled(stack, level); + ghostInventory.setStackInSlot(i, isRod ? stack : ItemStack.EMPTY); } } @@ -103,75 +111,55 @@ protected void addSlots() { } private void addPatternSlots() { - int startWidth = 8+23; + int startWidth = 8 + 23; int startHeight = 45; int incr = 18; - int i = 0; - int[][] positions = { - {3, 0}, {4, 0}, {5, 0}, - {2, 1}, {3, 1}, {4, 1}, {5, 1}, {6, 1}, - {1, 2}, {2, 2}, {3, 2}, {4, 2}, {5, 2}, {6, 2}, {7, 2}, - {0, 3}, {1, 3}, {2, 3}, {3, 3}, {4, 3}, {5, 3}, {6, 3}, {7, 3}, {8, 3}, - {0, 4}, {1, 4}, {2, 4}, {3, 4}, {4, 4}, {5, 4}, {6, 4}, {7, 4}, {8, 4}, - {0, 5}, {1, 5}, {2, 5}, {3, 5}, {4, 5}, {5, 5}, {6, 5}, {7, 5}, {8, 5}, - {1, 6}, {2, 6}, {3, 6}, {4, 6}, {5, 6}, {6, 6}, {7, 6}, - {2, 7}, {3, 7}, {4, 7}, {5, 7}, {6, 7}, - {3, 8}, {4, 8}, {5, 8} - }; - - for (int[] pos : positions) {// up and down not middle - this.addSlot(new SlotItemHandler(ghostInventory,i, startWidth + incr * pos[0], startHeight + incr * pos[1])); - i++; + + for (int i = 0; i < POSITIONS.length; i++) { + int[] pos = POSITIONS[i]; + this.addSlot(new SlotItemHandler(ghostInventory, i, startWidth + incr * pos[0], startHeight + incr * pos[1])); } } @Override protected void saveData(ItemStack contentHolder) { - int[][] positions = { - {3, 0}, {4, 0}, {5, 0}, - {2, 1}, {3, 1}, {4, 1}, {5, 1}, {6, 1}, - {1, 2}, {2, 2}, {3, 2}, {4, 2}, {5, 2}, {6, 2}, {7, 2}, - {0, 3}, {1, 3}, {2, 3}, {3, 3}, {4, 3}, {5, 3}, {6, 3}, {7, 3}, {8, 3}, - {0, 4}, {1, 4}, {2, 4}, {3, 4}, {4, 4}, {5, 4}, {6, 4}, {7, 4}, {8, 4}, - {0, 5}, {1, 5}, {2, 5}, {3, 5}, {4, 5}, {5, 5}, {6, 5}, {7, 5}, {8, 5}, - {1, 6}, {2, 6}, {3, 6}, {4, 6}, {5, 6}, {6, 6}, {7, 6}, - {2, 7}, {3, 7}, {4, 7}, {5, 7}, {6, 7}, - {3, 8}, {4, 8}, {5, 8} - }; + Level level = playerInventory.player.level(); // `pattern` keeps the grid exactly as the player laid it out; `patternAll` is the // normalized view where every empty slot AND every non-rod item becomes a glass // pane, so consumers can assume it only ever holds real rods (see PatternReader). - PatternData[] patternData = new PatternData[positions.length]; - PatternData[] patternAllData = new PatternData[positions.length]; + PatternData[] pattern = new PatternData[POSITIONS.length]; + PatternData[] patternAll = new PatternData[POSITIONS.length]; ItemStack glassPane = new ItemStack(Items.GLASS_PANE); int countGraphiteRod = 0; int countUraniumRod = 0; - for (int i = 0; i < positions.length; i++) { + for (int i = 0; i < POSITIONS.length; i++) { ItemStack stack = ghostInventory.getStackInSlot(i); - if (!stack.isEmpty() && stack.getCount() >= 1 && stack.getCount() <= 99) { - if (stack.is(CNItemTags.COOLER.tag)) { - countGraphiteRod++; - } - if (stack.is(CNItemTags.FUEL.tag)) { - countUraniumRod++; - } - patternData[i] = new PatternData(i, stack); - - RodType rodType = RodType.resolveRodType(stack.getItem(), playerInventory.player.level()); - boolean isRod = rodType.type() == TypeRod.FUEL || rodType.type() == TypeRod.COOLER; - patternAllData[i] = new PatternData(i, isRod ? stack : glassPane); - } else { - patternData[i] = new PatternData(i, glassPane); - patternAllData[i] = new PatternData(i, glassPane); + if (stack.isEmpty() || stack.getCount() < 1 || stack.getCount() > 99) { + pattern[i] = new PatternData(i, glassPane); + patternAll[i] = new PatternData(i, glassPane); + continue; } - } - ReactorBluePrintData reactorBluePrintData = new ReactorBluePrintData(countGraphiteRod, countUraniumRod, CNConfigs.common().rods.graphiteRodLifetime.get(), CNConfigs.common().rods.uraniumRodLifetime.get(), patternData, patternAllData); - contentHolder.set(CNDataComponents.REACTOR_BLUE_PRINT_DATA, reactorBluePrintData); + boolean isFuel = TypeRodPredicate.isFuel(stack, level); + boolean isCooler = TypeRodPredicate.isCooled(stack, level); + + if (isCooler) countGraphiteRod++; + if (isFuel) countUraniumRod++; + + pattern[i] = new PatternData(i, stack); + patternAll[i] = new PatternData(i, (isFuel || isCooler) ? stack : glassPane); + } + ReactorBluePrintData data = new ReactorBluePrintData( + countGraphiteRod, countUraniumRod, + CNConfigs.server().rods.graphiteRodLifetime.get(), + CNConfigs.server().rods.uraniumRodLifetime.get(), + pattern, patternAll + ); + contentHolder.set(CNDataComponents.REACTOR_BLUE_PRINT_DATA, data); } protected int getPlayerInventoryXOffset() { @@ -190,7 +178,7 @@ public boolean stillValid(Player player) { @Override public void clicked(int slotId, int dragType, ClickType clickTypeIn, Player player) { if (clickTypeIn == ClickType.THROW) { - if ( slotId >= 0 && slotId < 9) { + if (slotId >= 0 && slotId < 9) { clickTypeIn = ClickType.PICKUP; super.clicked(slotId, dragType, clickTypeIn, player); } @@ -198,4 +186,4 @@ public void clicked(int slotId, int dragType, ClickType clickTypeIn, Player play } super.clicked(slotId, dragType, clickTypeIn, player); } -} \ No newline at end of file +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/test.txt b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/test.txt deleted file mode 100644 index e32c721..0000000 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/test.txt +++ /dev/null @@ -1,16 +0,0 @@ -contentHolder: - ReactorBluePrintData[ - countGraphiteRod=0, - countUraniumRod=0, - graphiteTime=0, - uraniumTime=0, - pattern=[Lnet.nuclearteam.createnuclear.content.multiblock.bluePrintItem.PatternData;@341d34dd, - patternAll=[Lnet.nuclearteam.createnuclear.content.multiblock.bluePrintItem.PatternData;@341d34dd], - [ - PatternData[slot=0, stack=1 minecraft:glass_pane], PatternData[slot=1, stack=1 minecraft:glass_pane], PatternData[slot=2, stack=1 minecraft:glass_pane], - PatternData[slot=3, stack=1 minecraft:glass_pane], PatternData[slot=4, stack=1 minecraft:glass_pane], PatternData[slot=5, stack=1 minecraft:glass_pane], - PatternData[slot=6, stack=1 minecraft:glass_pane], PatternData[slot=7, stack=1 minecraft:glass_pane], PatternData[slot=8, stack=1 minecraft:glass_pane], - PatternData[slot=9, stack=1 minecraft:glass_pane], PatternData[slot=10, stack=1 minecraft:glass_pane], PatternData[slot=11, stack=1 minecraft:glass_pane], - PatternData[slot=12, stack=1 minecraft:glass_pane], PatternData[slot=13, stack=1 minecraft:glass_pane], PatternData[slot=14, stack=1 minecraft:glass_pane], - PatternData[slot=15, stack=1 minecraft:glass_pane], PatternData[slot=16, stack=1 minecraft:glass_pane], PatternData[slot=17, stack=1 minecraft:glass_pane], PatternData[slot=18, stack=1 minecraft:glass_pane], PatternData[slot=19, stack=1 minecraft:glass_pane], PatternData[slot=20, stack=1 minecraft:glass_pane], PatternData[slot=21, stack=1 minecraft:glass_pane], PatternData[slot=22, stack=1 minecraft:glass_pane], PatternData[slot=23, stack=1 minecraft:glass_pane], PatternData[slot=24, stack=1 minecraft:glass_pane], PatternData[slot=25, stack=1 minecraft:glass_pane], PatternData[slot=26, stack=1 minecraft:glass_pane], PatternData[slot=27, stack=1 minecraft:glass_pane], PatternData[slot=28, stack=1 minecraft:glass_pane], PatternData[slot=29, stack=1 minecraft:glass_pane], PatternData[slot=30, stack=1 minecraft:glass_pane], PatternData[slot=31, stack=1 minecraft:glass_pane], PatternData[slot=32, stack=1 minecraft:glass_pane], PatternData[slot=33, stack=1 minecraft:glass_pane], PatternData[slot=34, stack=1 minecraft:glass_pane], PatternData[slot=35, stack=1 minecraft:glass_pane], PatternData[slot=36, stack=1 minecraft:glass_pane], PatternData[slot=37, stack=1 minecraft:glass_pane], PatternData[slot=38, stack=1 minecraft:glass_pane], PatternData[slot=39, stack=1 minecraft:glass_pane], PatternData[slot=40, stack=1 minecraft:glass_pane], PatternData[slot=41, stack=1 minecraft:glass_pane], PatternData[slot=42, stack=1 minecraft:glass_pane], PatternData[slot=43, stack=1 minecraft:glass_pane], PatternData[slot=44, stack=1 minecraft:glass_pane], PatternData[slot=45, stack=1 minecraft:glass_pane], PatternData[slot=46, stack=1 minecraft:glass_pane], PatternData[slot=47, stack=1 minecraft:glass_pane], PatternData[slot=48, stack=1 minecraft:glass_pane], PatternData[slot=49, stack=1 minecraft:glass_pane], PatternData[slot=50, stack=1 minecraft:glass_pane], PatternData[slot=51, stack=1 minecraft:glass_pane], PatternData[slot=52, stack=1 minecraft:glass_pane], PatternData[slot=53, stack=1 minecraft:glass_pane], -PatternData[slot=54, stack=1 minecraft:glass_pane], PatternData[slot=55, stack=1 minecraft:glass_pane], PatternData[slot=56, stack=1 minecraft:glass_pane]] \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCCommon.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCCommon.java index 0672786..9d85f11 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCCommon.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCCommon.java @@ -4,8 +4,6 @@ public class CNCCommon extends ConfigBase { public final CWorldGen worldGen = nested(0, CWorldGen::new, Comments.worldGen); - public final CRods rods = nested(0, CRods::new, Comments.rods); - public final CExplode explode = nested(0, CExplode::new, Comments.explode); @Override public String getName() { @@ -13,8 +11,6 @@ public String getName() { } private static class Comments { - static String worldGen = "Modify CreateNuclear's impact on your terrain"; - static String rods = "Modify rods time and config"; - static String explode = "Explose: pas d'idée"; + static String worldGen = "Modify how CreateNuclear affects world generation."; } } diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCServer.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCServer.java index d8e4a77..ac41f5d 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCServer.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCServer.java @@ -11,15 +11,14 @@ public class CNCServer extends ConfigBase { @Override public String getName() { - return "server"; + return "Server"; } private static class Comments { static String rods = "Modify rod durations and related parameters."; - static String explode = "[WIP] Modify explosion parameters."; - static String radiation = "Enable or disable radiation effects emitted by mod items."; + static String radiation = "Enable or disable radiation effects emitted by mod items. "; static String notify = "Notification settings for reactor warnings."; static String reactorHeat = "Heat thresholds for different reactor sizes"; static String biomeRestore = "Control how irradiated biomes are restored back to their original biome."; } -} +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNConfigs.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNConfigs.java index a566594..fd1ddc5 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNConfigs.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNConfigs.java @@ -15,7 +15,7 @@ import java.util.Map.Entry; import java.util.function.Supplier; -@EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD) +@EventBusSubscriber public class CNConfigs { private static final Map CONFIGS = new EnumMap<>(ModConfig.Type.class); diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNotify.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNotify.java index e53a67c..7ef0c44 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNotify.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNotify.java @@ -3,7 +3,6 @@ import net.createmod.catnip.config.ConfigBase; public class CNotify extends ConfigBase { - public final ConfigBool warnAllPlayers = b(false, "warn_all_players", Comments.warning); public final ConfigInt warningDistance = i(100, 30, 5000, "warning_distance_blocks", Comments.rangeOfWarning); diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRadiation.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRadiation.java index 892d91d..14fc636 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRadiation.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRadiation.java @@ -46,16 +46,16 @@ public static class ConfiguredLists extends ConfigBase { public void registerAll(ModConfigSpec.Builder builder) { ENTITY_BLACKLIST = builder - .comment(Comments.blackListEntity) - .defineListAllowEmpty( - List.of("entity_blacklist"), - () -> List.of( - "minecraft:armor_stand", - "minecraft:item_frame", - "minecraft:glow_item_frame" - ), - obj -> obj instanceof String - ); + .comment(Comments.blackListEntity) + .defineListAllowEmpty( + List.of("entity_blacklist"), + () -> List.of( + "minecraft:armor_stand", + "minecraft:item_frame", + "minecraft:glow_item_frame" + ), + obj -> obj instanceof String + ); } @Override diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRods.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRods.java index 9d70893..ec7edcd 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRods.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRods.java @@ -5,12 +5,12 @@ @MethodsReturnNonnullByDefault public class CRods extends ConfigBase { - public final ConfigInt uraniumRodLifetime = i(3600, 100, 5000, "Uranium rod lifespan", Comments.UraniumRodLifetime, Comments.hintTick); + public final ConfigInt uraniumRodLifetime = i(3600, 100, 5000, "uranium_rod_lifetime_ticks", Comments.uraniumRodLifetime, Comments.hintTick); public final ConfigInt uraniumProximityBonus = i(32, -70, 70, "uranium_proximity_bonus", Comments.warning, Comments.uraniumProximityBonus); public final ConfigInt uraniumBaseValue = i(64, -70, 70, "uranium_base_value", Comments.warning, Comments.uraniumBaseValue); public final ConfigInt uraniumHeatRatio = i(2, -10, 10, "Heat ratio for uranium rods", Comments.warning, Comments.uraniumHeatRatio); - public final ConfigInt graphiteRodLifetime = i(3600, 100, 5000, "Graphite rod lifespan", Comments.GraphiteRodLifetime, Comments.hintTick); + public final ConfigInt graphiteRodLifetime = i(3600, 100, 5000, "graphite_rod_lifetime_ticks", Comments.graphiteRodLifetime, Comments.hintTick); // the proximity value of coolant items are divisions so if the heat of the fuel is 64, the calcul will be "heat + 64/-4" public final ConfigFloat graphiteProximityMalus = f(-0.25f, -70, 70, "graphite_proximity_penalty", Comments.warning, Comments.graphiteProximityMalus); public final ConfigInt graphiteBaseValue = i(-32, -50, 50, "graphite_base_value", Comments.warning, Comments.graphiteBaseValue); @@ -21,23 +21,23 @@ public class CRods extends ConfigBase { public final ConfigInt baseValueThorium = i(16, -70, 70, "Base heat value for thorium rods", Comments.warning, Comments.thoriumBaseValue); public final ConfigInt thoriumHeatRatio = i(1, -10, 10, "Heat ratio for thorium rods", Comments.warning, Comments.thoriumHeatRatio); - public final ConfigInt maxHeat = i(1000, 200, 1000, "Maximum reactor heat", Comments.maxHeat, Comments.hintHeat); @Override public String getName() { - return "Rods"; + return "rods"; } private static class Comments { static String hintTick = "20 ticks = 1 second"; static String warning = "Changing these values may unbalance reactor behavior."; + static String maxFuelPerCooled = "Maximum fuel rods supported by a single cooled rod"; - static String UraniumRodLifetime = "Uranium rod lifespan in reactor"; + static String uraniumRodLifetime = "Lifetime of uranium rods in ticks."; static String uraniumProximityBonus = "Heat bonus applied when uranium rods are adjacent."; static String uraniumBaseValue = "Base heat contribution of a uranium rod before modifiers."; static String uraniumHeatRatio = "Heat ratio modifier for a uranium rod"; - static String GraphiteRodLifetime = "Graphite rod lifespan in reactor"; + static String graphiteRodLifetime = "Lifetime of graphite (cooling) rods in ticks."; static String graphiteProximityMalus = "Heat penalty applied when graphite rods are adjacent."; static String graphiteBaseValue = "Base heat contribution of a graphite rod before modifiers."; static String graphiteHeatRatio = "Heat ratio modifier for a graphite rod"; @@ -47,7 +47,5 @@ private static class Comments { static String thoriumBaseValue = "Base heat contribution of a thorium rod before modifiers"; static String thoriumHeatRatio = "Heat ratio modifier for a thorium rod"; - static String maxHeat = "Maximum heat a reactor block can handle"; - static String hintHeat = "Avoids reactor failure due to excessive heat"; } -} +} \ No newline at end of file From d2a92a493998faef69d2964f31d90bce17fa0111 Mon Sep 17 00:00:00 2001 From: Giovanni Date: Sun, 9 Aug 2026 20:50:15 +0200 Subject: [PATCH 33/33] refactor(blueprint): drop stored graphite/uranium timers and derive patternAll on demand MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ReactorBluePrintData stored a redundant `patternAll` view alongside `pattern`, plus graphiteTime/uraniumTime fields that duplicated the CRods config values and could drift from them. Simplify the record to just the rod counts and the raw pattern, deriving the normalized "rods only" view on demand via RodType resolution instead of persisting it. - ReactorBluePrintData: drop graphiteTime/uraniumTime and the stored patternAll array; rename countGraphiteRod/countUraniumRod to countCooledRod/countFuelRod; add a static EMPTY sentinel instance; replace the stored patternAll() accessor with a computed patternAll(Level) method that rebuilds the normalized view from pattern() via TypeRodPredicate.isFuel/isCooled on every call; update CODEC/STREAM_CODEC and the equals()/hashCode() overrides (using a record deconstruction pattern) to match the trimmed field set - PatternReader: readItemCounts(ItemStack, Level) now takes a Level (needed to resolve patternAll(Level)); read via data.patternAll(level) instead of the old patternAll()/pattern() fallback chain, since patternAll can no longer diverge from pattern on disk - ConsumptionCycleManager / ReactorHeatUpdateCoordinator: thread a Level through to PatternReader.readItemCounts(...) and checkPatternAvailability(...) at every call site; replace `pattern.get(...) == null` / `configuredPattern.isEmpty()` empty checks with `getOrDefault(..., ReactorBluePrintData.EMPTY) == ReactorBluePrintData.EMPTY` - ReactorControllerBlockEntity: add a private getConfiguredPatternData() helper wrapping getOrDefault(..., ReactorBluePrintData.EMPTY); use it in addToGoggleTooltip(), isEmptyConfiguredPattern(), getConfiguredPatternCoolerRodCount() and getConfiguredPatternFuelRodCount(), replacing the old null-data checks and the renamed countGraphiteRod()/countUraniumRod() calls - ReactorControllerBlock: update the blueprint-placement empty check to use getOrDefault(..., ReactorBluePrintData.EMPTY) instead of a direct get() != null check - ReactorBluePrintMenu: stop building/storing a separate patternAll array in saveData() and stop passing graphite/uranium rod lifetimes into ReactorBluePrintData (no longer part of the record); update the default-data construction accordingly; drop the now-unused CNConfigs import - DefaultHeatCalculatorGameTest: update the ReactorBluePrintData constructor call to the new 3-argument signature (countCooledRod, countFuelRod, pattern) - PatternData: minor codec formatting cleanup (no behavior change) - PORTAGE_REACTEUR.md: document this rework of the blueprint data model as part of the Forge→NeoForge reactor port notes - AUDIT_NEOFORGE.md: minor text update --- AUDIT_NEOFORGE.md | 2 +- PORTAGE_REACTEUR.md | 77 +++++++++++++++++++ .../multiblock/bluePrintItem/PatternData.java | 24 +++--- .../bluePrintItem/ReactorBluePrintData.java | 61 +++++++++------ .../bluePrintItem/ReactorBluePrintMenu.java | 27 ++----- .../controller/ReactorControllerBlock.java | 3 +- .../ReactorControllerBlockEntity.java | 15 ++-- .../consumable/ConsumptionCycleManager.java | 9 ++- .../controller/consumable/PatternReader.java | 22 +++--- .../service/ReactorHeatUpdateCoordinator.java | 13 ++-- .../DefaultHeatCalculatorGameTest.java | 2 +- 11 files changed, 166 insertions(+), 89 deletions(-) diff --git a/AUDIT_NEOFORGE.md b/AUDIT_NEOFORGE.md index 9fa32ba..103bdff 100644 --- a/AUDIT_NEOFORGE.md +++ b/AUDIT_NEOFORGE.md @@ -29,7 +29,7 @@ En revanche, les points ci-dessous sont de **vraies erreurs de logique** (invers | # | Fichier:ligne | Problème | Priorité | |---|---|---|---| -| B1 | `content/multiblock/bluePrintItem/ReactorBluePrintItemScreen.java:56-65,71-73` | Les comptes de barres uranium/graphite sont inversés et un `+3` magique est ajouté lors de l'appel à `sendValueUpdate`, puis `sendValueUpdate` renvoie `countGraphiteRod` deux fois au lieu de `countUraniumRod` pour le dernier paramètre : le comptage des barres envoyé au serveur est corrompu. | 🔴 | +| B1 | `content/multiblock/bluePrintItem/ReactorBluePrintItemScreen.java:56-65,71-73` | Les comptes de barres uranium/graphite sont inversés et un `+3` magique est ajouté lors de l'appel à `sendValueUpdate`, puis `sendValueUpdate` renvoie `countCooledRod` deux fois au lieu de `countFuelRod` pour le dernier paramètre : le comptage des barres envoyé au serveur est corrompu. | 🔴 | | B2 | `content/radiation/capability/RadiationCapability.java:220-223` | Dans `applyEffects`, la branche `radiationLevel3` et la branche `else` utilisent toutes deux `amplifierLevel2.get()` (copier-coller) : il manque un `amplifierLevel3`, l'amplificateur d'effet plafonne au niveau 2 quel que soit le niveau réel de radiation. | 🟠 | | B3 | `content/multiblock/controller/manager/ReactorInputFluidManager.java:129-130,148-149` | `int tank = h.getTanks(); h.getFluidInTank(tank);` utilise le *nombre* de tanks comme *index* (valides : `0..getTanks()-1`) → accès systématiquement hors bornes. | 🟠 | | B4 | `lib/multiblock/manager/MultiBlockCache.java:22-24` | `isCached()` a une sémantique inversée : `return cachedResult == null` renvoie `true` quand **rien n'est en cache**. (Classe par ailleurs non utilisée, cf. §1.) | 🟡 | diff --git a/PORTAGE_REACTEUR.md b/PORTAGE_REACTEUR.md index 3446aa3..b0ad09b 100644 --- a/PORTAGE_REACTEUR.md +++ b/PORTAGE_REACTEUR.md @@ -162,6 +162,83 @@ Cœur du modèle : équilibre 6:1 fuel/cooler, surchauffe qui s'accélère (`ove > `saveData` construit désormais deux tableaux distincts. `getItemStorage()` continue de lire > `pattern()` (brut), comme la version Forge qui lit l'élément NBT `pattern`. +#### Lot 2bis — Migration NBT → Data Components du blueprint ✅ FAIT (9 août 2026) + +Le lot 2 ci-dessus portait la lecture du pattern ; ce qui suit va plus loin et retravaille le +**stockage** du blueprint lui-même (`bluePrintItem/`), au-delà d'un simple portage d'API. + +**Point de départ.** À l'ouverture de ce chantier, le blueprint NeoForge était dans un état +intermédiaire : `ReactorBluePrintData`/`PatternData` (les vrais Data Components) coexistaient +avec des restes NBT jamais nettoyés après leur introduction — un composant +`CNDataComponents.PATTERN` qui ne faisait que réemballer une `CompoundTag` (jamais écrit, +toujours lu vide), un paquet réseau (`ReactorBluePrintItemPacket`) hérité du portage Forge dont +**tous les champs étaient write-only** côté client (`heat`, compteurs, `progress`, +`sendUpdate` : aucun n'était relu par un rendu ou une logique quelconque), et quatre Data +Components orphelins (`URANIUM_TIME`, `GRAPHITE_TIME`, `COUNT_GRAPHITE_ROD`, +`COUNT_URANIUM_ROD`) enregistrés mais jamais lus ni écrits. + +**Ce qui a été fait :** +- Suppression complète du paquet réseau et de son enregistrement dans `CNPackets` : ce menu + n'a structurellement besoin d'aucun paquet, dans aucun sens. C'est un menu à un seul joueur + possible (item tenu en main), l'édition du pattern passe déjà par la synchronisation de slots + vanilla, et `saveData()` (`MenuBase#removed`, dans Create) écrit directement sur le + `contentHolder` serveur sans aller-retour réseau. +- Suppression de `CNDataComponents.PATTERN` et des quatre composants orphelins. +- `ReactorBluePrintData` réduit à `(int countCooledRod, int countFuelRod, PatternData[] pattern)` : + `patternAll` n'est plus persisté ni synchronisé, il est dérivé à la demande + (`patternAll(Level)`) depuis `pattern`, ce qui élimine par construction le risque de + divergence entre les deux vues qui avait motivé la correction du lot 2. `graphiteTime`/ + `uraniumTime` sont retirés aussi : ce n'étaient que des constantes de config recopiées sur + chaque blueprint, jamais lues nulle part. +- Ajout d'un sentinel `ReactorBluePrintData.EMPTY`, qui remplace sept réimplémentations + indépendantes de « ce blueprint est-il configuré ? » (`configuredPattern.get(...) == null`, + dupliqué dans `ReactorControllerBlockEntity` ×4, `ReactorControllerBlock`, + `ReactorHeatUpdateCoordinator`, `ConsumptionCycleManager`) par un seul point de vérité, + comparé par identité (`== EMPTY`), sur le même principe que `ItemStack.EMPTY`. + +**Bug trouvé et corrigé, propre à NeoForge :** un blueprint contenant des barres de thorium +perdait silencieusement ces barres à la réouverture du menu (confirmé par un dump NBT +`/setblock` montrant le pattern correctement sauvegardé, mais absent une fois le menu rouvert). +Cause : `THORIUM_ROD` est enregistré `.fuelRodType()` côté `RodType` (`CNItems.java`), mais son +`.tag(...)` n'incluait pas `CNItemTags.FUEL.tag` — contrairement à `URANIUM_ROD`/`GRAPHITE_ROD`, +qui ont bien leur tag. `ReactorBluePrintMenu#initAndReadInventory` filtrait la réaffichage sur +ce tag plutôt que sur `RodType`, donc le thorium passait la sauvegarde mais échouait +silencieusement à la relecture. Corrigé à deux niveaux : le tag manquant ajouté dans +`CNItems.java`, et le filtre de réaffichage réécrit pour utiliser `RodType`/`TypeRodPredicate` +partout (comptage, `pattern`, `patternAll`, réaffichage), la même source de vérité que +`saveData` utilisait déjà pour `patternAll`. + +**Bug de config trouvé au passage, sans lien avec les Data Components :** `CNCCommon` déclarait +sa propre instance de `CRods` (`Type.COMMON`), en plus de celle déjà présente dans `CNCServer` +(`Type.SERVER`) — deux fichiers de config distincts pour la même donnée conceptuelle. Absent +côté Forge, où `CRods` ne vit que dans le config serveur. `ReactorBluePrintMenu` lisait la +copie `COMMON`, `RodType`/`CNItems` la copie `SERVER` : un admin modifiant l'une sans l'autre +aurait désynchronisé silencieusement la durée de vie affichée sur le blueprint de celle +réellement utilisée par le calcul de chaleur. Le champ dupliqué a été retiré de `CNCCommon`, +`ReactorBluePrintMenu` lit désormais `CNConfigs.server().rods`, comme le reste du code. + +> **Différence assumée entre Forge et NeoForge, à ne pas « corriger » lors d'une synchro.** +> Forge stocke le blueprint en NBT brut sur l'`ItemStack` (`getOrCreateTag().put("pattern", ...)`). +> NeoForge le stocke en Data Component typé (`ReactorBluePrintData`, `Codec` + `StreamCodec`). +> Ce n'est pas un écart à réduire : NBT muté en place sur un `ItemStack` casse silencieusement +> en 1.21 (voir §5.1, `copyTag()` renvoie une copie défensive), et les Data Components sont la +> direction que 1.21 impose pour ce genre de donnée structurée. Une synchro Forge → NeoForge sur +> `bluePrintItem/` ne doit **jamais** réintroduire de `CompoundTag`/`getOrCreateTag()` ; elle doit +> traduire chaque nouveau champ NBT Forge en champ du record `ReactorBluePrintData`, avec son +> propre `Codec`/`StreamCodec`, sur le modèle de `PatternData`. +> +> Différence secondaire assumée : le paquet réseau `ReactorBluePrintItemPacket` que Forge +> utilise n'a pas d'équivalent côté NeoForge, par choix, pas par oubli — voir le lot 2bis +> ci-dessus. S'il réapparaît un jour côté Forge avec un vrai usage (affichage de statistiques), +> ne pas le traduire tel quel : passer par la synchronisation de menu vanilla +> (`ContainerData`/`DataSlot`) plutôt que par un paquet personnalisé. + +**Ce qu'il reste, honnêtement :** aucun bug connu à ce stade sur `bluePrintItem/` après cette +passe. Le point réellement ouvert est la **couverture de test** : les 29 gametests ne couvrent +pas le cas qui a produit le bug du thorium (un `RodType` enregistré sans le tag `CNItemTags` +correspondant). Ajouter un cas de ce genre permettrait à une future régression similaire +d'échouer un test plutôt que de n'être trouvée qu'en jeu. + ### Lot 3 — Services (`service/`, 12 fichiers sur 14) ✅ FAIT `IHeatService` / `DefaultHeatService` · `IExplosionService` / `ReactorMeltdownExecutor` · `IReactorMeltdownMonitor` / `ReactorMeltdownMonitor` · `IReactorAlarmCoordinator` / `ReactorAlarmCoordinator` · `IReactorHeatUpdateCoordinator` / `ReactorHeatUpdateCoordinator` · `IFluidConsumptionRateCalculator` / `FluidConsumptionRateCalculator` diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/PatternData.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/PatternData.java index 1d880a3..9aa7e6e 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/PatternData.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/PatternData.java @@ -17,16 +17,13 @@ public record PatternData(int slot, ItemStack stack) { * codec, any blueprint sitting in a controller made the block entity throw at chunk-save time, * so the controller silently lost its blueprint on every world reload. *

- * The encoding of non-empty stacks is identical between the two codecs — only the empty stack - * changes, from "rejected" to {@code {}} — so blueprints already on disk still load. + * The encoding of non-empty stacks is identical between the two codecs: only the empty stack + * changes, from "rejected" to {@code {}}, so blueprints already on disk still load. */ public static final Codec CODEC = RecordCodecBuilder.create(i -> i.group( - Codec.INT.fieldOf("slot").forGetter(PatternData::slot), - ItemStack.OPTIONAL_CODEC - .fieldOf("Stack") - .forGetter(PatternData::stack) - ).apply(i, PatternData::new) - ); + Codec.INT.fieldOf("slot").forGetter(PatternData::slot), + ItemStack.OPTIONAL_CODEC.fieldOf("Stack").forGetter(PatternData::stack) + ).apply(i, PatternData::new)); /** * Uses {@link ItemStack#OPTIONAL_STREAM_CODEC} for the same reason as {@link #CODEC}: @@ -34,12 +31,11 @@ public record PatternData(int slot, ItemStack stack) { * on the empty stack, and this component is {@code networkSynchronized}, so an unfilled pattern * failed to encode as soon as the blueprint was sent to a client. */ - public static final StreamCodec STREAM_CODEC = - StreamCodec.composite( - ByteBufCodecs.INT, PatternData::slot, - ItemStack.OPTIONAL_STREAM_CODEC, PatternData::stack, - PatternData::new - ); + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.INT, PatternData::slot, + ItemStack.OPTIONAL_STREAM_CODEC, PatternData::stack, + PatternData::new + ); public static ItemStack getDefaultStack() { return DEFAULT_STACK; diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintData.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintData.java index a1b39c5..d51e37e 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintData.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintData.java @@ -6,12 +6,18 @@ import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRodPredicate; import java.util.Arrays; import java.util.List; import java.util.Objects; -public record ReactorBluePrintData(int countGraphiteRod, int countUraniumRod, int graphiteTime, int uraniumTime, PatternData[] pattern, PatternData[] patternAll) { +public record ReactorBluePrintData(int countCooledRod, int countFuelRod, PatternData[] pattern) { + public static final ReactorBluePrintData EMPTY = new ReactorBluePrintData(0, 0, new PatternData[0]); + private static final Codec PATTERN_ARRAY_CODEC = PatternData.CODEC.listOf().xmap( list -> list.toArray(PatternData[]::new), List::of @@ -20,44 +26,51 @@ public record ReactorBluePrintData(int countGraphiteRod, int countUraniumRod, in private static final StreamCodec STREAM_PATTERN_ARRAY_CODEC = CatnipStreamCodecBuilders.array(PatternData.STREAM_CODEC, PatternData.class); public static final Codec CODEC = RecordCodecBuilder.create(instance -> - instance.group( - Codec.INT.fieldOf("countGraphiteRod").forGetter(ReactorBluePrintData::countGraphiteRod), - Codec.INT.fieldOf("countUraniumRod").forGetter(ReactorBluePrintData::countUraniumRod), - Codec.INT.fieldOf("graphiteTime").forGetter(ReactorBluePrintData::graphiteTime), - Codec.INT.fieldOf("uraniumTime").forGetter(ReactorBluePrintData::uraniumTime), - PATTERN_ARRAY_CODEC.fieldOf("pattern").forGetter(ReactorBluePrintData::pattern), - PATTERN_ARRAY_CODEC.fieldOf("patternAll").forGetter(ReactorBluePrintData::patternAll) - ).apply(instance, ReactorBluePrintData::new) + instance.group( + Codec.INT.fieldOf("countCooledRod").forGetter(ReactorBluePrintData::countCooledRod), + Codec.INT.fieldOf("countFuelRod").forGetter(ReactorBluePrintData::countFuelRod), + PATTERN_ARRAY_CODEC.fieldOf("pattern").forGetter(ReactorBluePrintData::pattern) + ).apply(instance, ReactorBluePrintData::new) ); public static final StreamCodec STREAM_CODEC = StreamCodec.composite( - ByteBufCodecs.INT, ReactorBluePrintData::countGraphiteRod, - ByteBufCodecs.INT, ReactorBluePrintData::countUraniumRod, - ByteBufCodecs.INT, ReactorBluePrintData::graphiteTime, - ByteBufCodecs.INT, ReactorBluePrintData::uraniumTime, + ByteBufCodecs.INT, ReactorBluePrintData::countCooledRod, + ByteBufCodecs.INT, ReactorBluePrintData::countFuelRod, STREAM_PATTERN_ARRAY_CODEC, ReactorBluePrintData::pattern, - STREAM_PATTERN_ARRAY_CODEC, ReactorBluePrintData::patternAll, ReactorBluePrintData::new ); + /** + * Normalized view of {@link #pattern()}. Recomputed on demand, never stored. + */ + public PatternData[] patternAll(Level level) { + PatternData[] result = new PatternData[pattern().length]; + ItemStack glassPane = new ItemStack(Items.GLASS_PANE); + + for (int i = 0; i < pattern().length; i++) { + ItemStack stack = pattern()[i].stack(); + boolean isRods = TypeRodPredicate.isFuel(stack, level) || TypeRodPredicate.isCooled(stack, level); + + result[i] = new PatternData(i, isRods ? stack : glassPane); + } + + return result; + } + @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof ReactorBluePrintData that)) return false; - - return countGraphiteRod == that.countGraphiteRod - && countUraniumRod == that.countUraniumRod - && graphiteTime == that.graphiteTime - && uraniumTime == that.uraniumTime - && Arrays.equals(pattern, that.pattern) - && Arrays.equals(patternAll, that.patternAll); + if (!(o instanceof ReactorBluePrintData(int cooledRod, int fuelRod, PatternData[] pattern1))) return false; + + return countCooledRod == cooledRod + && countFuelRod == fuelRod + && Arrays.equals(pattern, pattern1); } @Override public int hashCode() { - int result = Objects.hash(countGraphiteRod, countUraniumRod, graphiteTime, uraniumTime); + int result = Objects.hash(countCooledRod, countFuelRod); result = 31 * result + Arrays.hashCode(pattern); - result = 31 * result + Arrays.hashCode(patternAll); return result; } } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintMenu.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintMenu.java index 143d528..d07f1f3 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintMenu.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintMenu.java @@ -15,7 +15,6 @@ import net.neoforged.neoforge.items.SlotItemHandler; import net.nuclearteam.createnuclear.*; import net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRodPredicate; -import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; import static net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintItem.getItemStorage; @@ -23,7 +22,7 @@ public class ReactorBluePrintMenu extends GhostItemMenu { /** * Grid position of each of the 57 pattern slots, index-matched to {@link PatternData#slot()} - * and to {@code DefaultHeatCalculator#FORMATTED_PATTERN} — the reactor's proximity-heat + * and to {@code DefaultHeatCalculator#FORMATTED_PATTERN}: the reactor's proximity-heat * calculation resolves neighbours by this exact index, so the array must never be reordered * or resized independently of that grid. */ @@ -72,12 +71,7 @@ protected void initAndReadInventory(ItemStack contentHolder) { emptyPattern[i] = new PatternData(i, glassPane); } - ReactorBluePrintData defaultData = new ReactorBluePrintData( - 0, 0, - CNConfigs.server().rods.graphiteRodLifetime.get(), - CNConfigs.server().rods.uraniumRodLifetime.get(), - emptyPattern, emptyPattern - ); + ReactorBluePrintData defaultData = new ReactorBluePrintData(0, 0, emptyPattern); reactorBluePrintData = contentHolder.getOrDefault(CNDataComponents.REACTOR_BLUE_PRINT_DATA, defaultData); // Classified via RodType, not via the CNItemTags.COOLER/FUEL item tags: a rod can be @@ -125,11 +119,11 @@ private void addPatternSlots() { protected void saveData(ItemStack contentHolder) { Level level = playerInventory.player.level(); - // `pattern` keeps the grid exactly as the player laid it out; `patternAll` is the - // normalized view where every empty slot AND every non-rod item becomes a glass - // pane, so consumers can assume it only ever holds real rods (see PatternReader). + // `pattern` keeps the grid exactly as the player laid it out. The normalized + // `patternAll` view (empty slots and non-rod items replaced by glass panes) is + // no longer built or stored here: ReactorBluePrintData#patternAll(Level) derives + // it from `pattern` on every call instead. See PatternReader. PatternData[] pattern = new PatternData[POSITIONS.length]; - PatternData[] patternAll = new PatternData[POSITIONS.length]; ItemStack glassPane = new ItemStack(Items.GLASS_PANE); int countGraphiteRod = 0; int countUraniumRod = 0; @@ -139,7 +133,6 @@ protected void saveData(ItemStack contentHolder) { if (stack.isEmpty() || stack.getCount() < 1 || stack.getCount() > 99) { pattern[i] = new PatternData(i, glassPane); - patternAll[i] = new PatternData(i, glassPane); continue; } @@ -150,15 +143,9 @@ protected void saveData(ItemStack contentHolder) { if (isFuel) countUraniumRod++; pattern[i] = new PatternData(i, stack); - patternAll[i] = new PatternData(i, (isFuel || isCooler) ? stack : glassPane); } - ReactorBluePrintData data = new ReactorBluePrintData( - countGraphiteRod, countUraniumRod, - CNConfigs.server().rods.graphiteRodLifetime.get(), - CNConfigs.server().rods.uraniumRodLifetime.get(), - pattern, patternAll - ); + ReactorBluePrintData data = new ReactorBluePrintData(countGraphiteRod, countUraniumRod, pattern); contentHolder.set(CNDataComponents.REACTOR_BLUE_PRINT_DATA, data); } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlock.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlock.java index 78c92e6..b7c13e7 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlock.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlock.java @@ -29,6 +29,7 @@ import net.nuclearteam.createnuclear.content.multiblock.IHeat; import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; import net.nuclearteam.createnuclear.content.multiblock.ReactorAssembler; +import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintData; import net.nuclearteam.createnuclear.content.multiblock.input.fluid.PersistentFluidLocks; import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancement; import net.nuclearteam.createnuclear.foundation.block.HorizontalDirectionalReactorBlock; @@ -105,7 +106,7 @@ protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Lev } else { if (heldItem.is(CNItems.REACTOR_BLUEPRINT.get()) && controllerBlockEntity.getInventoryObject().getItem(0).isEmpty() - && heldItem.get(CNDataComponents.REACTOR_BLUE_PRINT_DATA) != null){ + && heldItem.getOrDefault(CNDataComponents.REACTOR_BLUE_PRINT_DATA, ReactorBluePrintData.EMPTY) != ReactorBluePrintData.EMPTY){ withBlockEntityDo(level, pos, be -> { be.getInventoryObject().setStackInSlot(0, heldItem); be.setConfiguredPattern(heldItem); diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlockEntity.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlockEntity.java index c1ebcf9..d8b2a78 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlockEntity.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlockEntity.java @@ -25,6 +25,7 @@ import net.nuclearteam.createnuclear.CreateNuclear; import net.nuclearteam.createnuclear.api.multiblock.IMultiblockController; import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintData; import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorDisplayState; import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorGoggleTooltipRenderer; import net.nuclearteam.createnuclear.content.multiblock.controller.service.*; @@ -139,6 +140,10 @@ public int getConfiguredPatternHeat() { return Math.round(this.configuredPattern.getOrDefault(CNDataComponents.HEAT, 0f)); } + private ReactorBluePrintData getConfiguredPatternData() { + return getConfiguredPattern().getOrDefault(CNDataComponents.REACTOR_BLUE_PRINT_DATA, ReactorBluePrintData.EMPTY); + } + /** @return the first loaded fluid, or {@code null} if no fluid is present. */ private BigFluidStack currentFluidStack() { return bigFluidStack.isEmpty() ? null : bigFluidStack.get(0); @@ -250,7 +255,7 @@ public boolean getAssembled() { // returns whether the reactor structure is curr @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { - if (configuredPattern.isEmpty() || configuredPattern.get(CNDataComponents.REACTOR_BLUE_PRINT_DATA) == null) { + if (getConfiguredPatternData() == ReactorBluePrintData.EMPTY) { return false; } @@ -384,13 +389,11 @@ public void tick() { * {@code ReactorBluePrintMenu#saveData}. */ private int getConfiguredPatternCoolerRodCount() { - var data = configuredPattern.get(CNDataComponents.REACTOR_BLUE_PRINT_DATA); - return data == null ? 0 : data.countGraphiteRod(); + return getConfiguredPatternData().countCooledRod(); } private int getConfiguredPatternFuelRodCount() { - var data = configuredPattern.get(CNDataComponents.REACTOR_BLUE_PRINT_DATA); - return data == null ? 0 : data.countUraniumRod(); + return getConfiguredPatternData().countFuelRod(); } /** @@ -464,7 +467,7 @@ private void handleAssembledState() { } private boolean isEmptyConfiguredPattern() { - return configuredPattern.isEmpty() || configuredPattern.get(CNDataComponents.REACTOR_BLUE_PRINT_DATA) == null; + return getConfiguredPatternData() == ReactorBluePrintData.EMPTY; } public void addInput(BlockPos inputPos) { diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ConsumptionCycleManager.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ConsumptionCycleManager.java index ae44bc9..bfe124a 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ConsumptionCycleManager.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ConsumptionCycleManager.java @@ -9,6 +9,7 @@ import net.minecraft.world.level.Level; import net.nuclearteam.createnuclear.CNDataComponents; import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; +import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintData; import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputManagerI; import java.util.*; @@ -25,7 +26,7 @@ public void startCycle(ItemStack pattern, Level level) { } public void resetCycle(ItemStack pattern, Level level, ReactorInputManagerI manager) { - Map counts = PatternReader.readItemCounts(pattern); + Map counts = PatternReader.readItemCounts(pattern, level); List updated = new ArrayList<>(); for (Map.Entry entry : counts.entrySet()) { @@ -113,7 +114,7 @@ public void deserializeNBT(CompoundTag tag) { } private void buildTimers(ItemStack pattern, Level level) { - PatternReader.readItemCounts(pattern).forEach((item, count) -> { + PatternReader.readItemCounts(pattern, level).forEach((item, count) -> { RodType rodType = RodType.resolveRodType(item, level); if (!rodType.isNotEmptyItem()) return; @@ -129,7 +130,7 @@ private void takeSnapshot(ItemStack pattern, Level level) { private Map readItemIds(ItemStack pattern, Level level) { Map result = new HashMap<>(); - PatternReader.readItemCounts(pattern).forEach((item, count) -> { + PatternReader.readItemCounts(pattern, level).forEach((item, count) -> { RodType rt = RodType.resolveRodType(item, level); if (rt.isNotEmptyItem()) result.put(BuiltInRegistries.ITEM.getKey(item).getPath(), count); @@ -147,7 +148,7 @@ private Map readItemIds(ItemStack pattern, Level level) { * checked this tick (used to throttle the check's frequency) */ public void update(ItemStack pattern, Level level, ReactorInputManagerI inputManager, boolean checkPatternChange) { - boolean emptyPattern = pattern.isEmpty() || pattern.get(CNDataComponents.REACTOR_BLUE_PRINT_DATA) == null; + boolean emptyPattern = pattern.getOrDefault(CNDataComponents.REACTOR_BLUE_PRINT_DATA, ReactorBluePrintData.EMPTY) == ReactorBluePrintData.EMPTY; if (isEmpty() && !emptyPattern) { startCycle(pattern, level); } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/PatternReader.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/PatternReader.java index 41c49c7..eae30dc 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/PatternReader.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/PatternReader.java @@ -3,6 +3,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; import net.nuclearteam.createnuclear.CNDataComponents; import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.PatternData; import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintData; @@ -17,20 +18,21 @@ * The Forge implementation parsed the raw {@code patternAll}/{@code pattern} NBT * elements off the blueprint stack. On NeoForge the blueprint carries a typed * {@link ReactorBluePrintData} data component instead, so the parsing is replaced - * by a direct read of {@link ReactorBluePrintData#patternAll()}. + * by a read of {@link ReactorBluePrintData#patternAll(Level)}. *

- * {@code patternAll} is the normalized view written by - * {@code ReactorBluePrintMenu#saveData}: empty slots and non-rod items are stored - * as glass panes, which is why glass panes are the only value skipped here. - * {@link ReactorBluePrintData#pattern()} (the raw grid) is used as a fallback for - * blueprints written before the two views diverged. + * {@code patternAll} is the normalized view: every empty slot and every non-rod + * item becomes a glass pane, so consumers can assume it only ever holds real rods, + * which is why glass panes are the only value skipped here. Unlike the earlier NBT + * port, it is not stored. {@link ReactorBluePrintData} only persists {@code pattern}, + * the raw grid, and derives {@code patternAll} from it on every call, so the two + * views can no longer diverge on disk. */ public final class PatternReader { private PatternReader() { } - public static Map readItemCounts(ItemStack configuredPattern) { + public static Map readItemCounts(ItemStack configuredPattern, Level level) { if (configuredPattern == null || configuredPattern.isEmpty()) return Collections.emptyMap(); @@ -38,10 +40,8 @@ public static Map readItemCounts(ItemStack configuredPattern) { if (data == null) return Collections.emptyMap(); - PatternData[] slots = data.patternAll(); - if (slots == null || slots.length == 0) - slots = data.pattern(); - if (slots == null || slots.length == 0) + PatternData[] slots = data.patternAll(level); + if (slots.length == 0) return Collections.emptyMap(); Map counts = new HashMap<>(); diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorHeatUpdateCoordinator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorHeatUpdateCoordinator.java index 1ce335e..505ef7b 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorHeatUpdateCoordinator.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorHeatUpdateCoordinator.java @@ -33,8 +33,7 @@ public ReactorHeatUpdateCoordinator(IHeatService heatService) { * {@link ReactorBluePrintData}. Replaces the Forge check on an empty NBT tag. */ private static boolean isEmptyPattern(ItemStack configuredPattern) { - return configuredPattern.isEmpty() - || configuredPattern.get(CNDataComponents.REACTOR_BLUE_PRINT_DATA) == null; + return configuredPattern.getOrDefault(CNDataComponents.REACTOR_BLUE_PRINT_DATA, ReactorBluePrintData.EMPTY) == ReactorBluePrintData.EMPTY; } /** @@ -52,7 +51,7 @@ private static void writeHeat(ItemStack configuredPattern, int heat) { @Override public HeatBalance calculateHeatBalance(ItemStack configuredPattern, ReactorDisplayState displayState, Level level) { - Map patternCounts = PatternReader.readItemCounts(configuredPattern); + Map patternCounts = PatternReader.readItemCounts(configuredPattern, level); Map currentItems = displayState != null && displayState.items() != null ? displayState.items() : Collections.emptyMap(); @@ -89,9 +88,9 @@ private interface PatternEntryCheck { * * @return {@code true} if {@code check} succeeded for every pattern entry */ - private static boolean checkPatternAvailability(ItemStack configuredPattern, ReactorDisplayState displayState, + private static boolean checkPatternAvailability(ItemStack configuredPattern, ReactorDisplayState displayState, Level level, PatternEntryCheck check) { - Map patternCounts = PatternReader.readItemCounts(configuredPattern); + Map patternCounts = PatternReader.readItemCounts(configuredPattern, level); Map currentItems = displayState != null && displayState.items() != null ? displayState.items() : Collections.emptyMap(); @@ -114,7 +113,7 @@ public boolean canRun(ItemStack configuredPattern, ReactorDisplayState displaySt } boolean[] hasAnyFuel = {false}; - boolean allFuelAvailable = checkPatternAvailability(configuredPattern, displayState, + boolean allFuelAvailable = checkPatternAvailability(configuredPattern, displayState, level, (item, requiredCount, availableCount) -> { RodType rodType = RodType.resolveRodType(item, level); if (rodType.isNotEmptyItem() && rodType.type() == RodType.TypeRod.FUEL) { @@ -134,7 +133,7 @@ public int updateHeatOnly(ItemStack configuredPattern, ReactorDisplayState displ int heat = 0; boolean emptyPattern = isEmptyPattern(configuredPattern); if (!emptyPattern && assembled) { - boolean allAvailable = checkPatternAvailability(configuredPattern, displayState, + boolean allAvailable = checkPatternAvailability(configuredPattern, displayState, level, (item, requiredCount, availableCount) -> availableCount >= requiredCount); if (allAvailable) { heat = (int) heatService.calculateHeat(fluidStack, heatBalance, previousHeat, inventory, level, displayState); diff --git a/src/main/java/net/nuclearteam/createnuclear/gametest/DefaultHeatCalculatorGameTest.java b/src/main/java/net/nuclearteam/createnuclear/gametest/DefaultHeatCalculatorGameTest.java index b2c4224..fdd8a74 100644 --- a/src/main/java/net/nuclearteam/createnuclear/gametest/DefaultHeatCalculatorGameTest.java +++ b/src/main/java/net/nuclearteam/createnuclear/gametest/DefaultHeatCalculatorGameTest.java @@ -81,7 +81,7 @@ private static ItemStack buildBlueprint(Map rodsBySlot) { ItemStack blueprint = new ItemStack(CNItems.REACTOR_BLUEPRINT.get()); blueprint.set(CNDataComponents.REACTOR_BLUE_PRINT_DATA, - new ReactorBluePrintData(0, 0, 0, 0, pattern, pattern)); + new ReactorBluePrintData(0, 0, pattern)); return blueprint; }