Skip to content

V2 - #25

Open
Giovanniricotta2002 wants to merge 124 commits into
mainfrom
V2
Open

V2#25
Giovanniricotta2002 wants to merge 124 commits into
mainfrom
V2

Conversation

@Giovanniricotta2002

Copy link
Copy Markdown
Member

No description provided.

Aph0rism and others added 30 commits July 22, 2026 13:38
Implement radiation items and effects, including RadiationItem class …
Add reactor alarm block and sound mechanics, including advancements f…
…on capability wiring

- Bump Create to 6.0.10-280, Ponder to 1.0.82, Flywheel to 1.0.6,
  Registrate to MC1.21-1.3.0+67, NeoForge to 21.1.247, JEI to
  19.43.0.390, and Jade to 7545219
- Disable Gradle configuration cache and add a client2 run
  configuration for local multiplayer testing
- Convert SimpleMultiBlockPattern to a record and drop the dead
  matches(java.util.logging.Level, ...) override and unused test()
  helper
- Remove the unused multiblock manager/cache classes
  (SimpleMultiBlockPatternBuilder, IBetterPattern, MultiBlockCache,
  MultiBlockManager, RegisteredMultiBlockPattern)
- Rename MultiBlockOffsetPos#caracter to #character and update all
  call sites
- Replace the unchecked Object cast in IodineEffect with a properly
  typed Attribute holder for CNAttributes.IRRADIATED_RESISTANCE
- Clean up fully-qualified references in CreateNuclear.java and
  PersistentFluidLocks.java in favor of imports
- Remove the enriching campfire block tag registration and its
  reactor casing sound events/subtitles (break, fall, hit, place,
  step) that are no longer used
- Add enriched_soul_soil to the enriching_fire_base_blocks tag and
  register enriching_fire/enriching_campfire as fan processing
  catalysts
- Add EnrichedRecipeGen skeleton under the new
  net.nuclearteam.createnuclear.api.data.recipe package, mirroring
  the existing foundation.data.recipe.EnrichedRecipeGen ahead of an
  API extraction
- Refresh generated datagen resources (lang files, sounds, block
  tags, datagen cache) to match the above changes
…turing

Remove the 48 per-color model, recipe, and advancement JSON files for
anti-radiation armor pieces, replacing them with a single default model
per armor slot (boots/chestplate/helmet/leggings) plus a colored/
variant folder. Introduce AntiRadiationArmorTextureMixin to resolve the
correct texture/color at render time instead of relying on baked
per-dye assets, and add ClothTagHelper and CNBuilderTransformers to
support the new tag-driven dye/cloth lookup.

Update CNItems, CNTags, CNDataComponents, CNEntityType,
AntiRadiationArmorItem/ClientExtensions, ClothItem, RadiationEffect,
and related registries to wire up the new structure, and drop the
now-unused default_anti_radiation_suit.png texture and obsolete dye
tag files (anti_radiation_*_dye.json, all_anti_radiation_armors.json).
Re-enable the previously commented-out SmithingClothRecipeBuilder calls
in CNItems for helmet, chestplate, leggings, and boots, generating a
smithing recipe per cloth color (skipping Cloths.DEFAULT) that applies
a colored cloth to the base armor piece. Back this with a new
SmithingTransformRecipeMixin (registered in
createnuclear.neoforge.mixins.json) and SmithingClothRecipeBuilder API
class, and regenerate the resulting smithing recipe/advancement JSON
under src/generated/resources/data/createnuclear/{recipe,advancement}/smithing/.

Change CNDataComponents' CLOTH_ITEM component from a raw ItemStack to a
new ClothItemStack wrapper record that implements content-based
equals/hashCode (via ItemStack.isSameItemSameComponents/
hashItemAndComponents), since NeoForge requires data component values
to implement proper value equality. Update ClothTagHelper and
CNBuilderTransformers accordingly, and refresh the colored anti-radiation
armor model JSONs to match. Minor unrelated fix to gradlew.bat.
Giovanniricotta2002 and others added 30 commits August 14, 2026 20:41
…rControllerBlockEntity

Purely cosmetic whitespace cleanup, no behavior change.

- Fix the displayState field declaration's indentation (3 spaces →
  4 spaces, matching the rest of the class)
- Remove a stray blank line between
  getConfiguredPatternCoolerRodCount() and
  getConfiguredPatternFuelRodCount()
…doc after RodType alignment

Small trailing cleanups now that RodType has been aligned with the
Forge implementation (see prior "refactor(rod-type)" commits), plus
re-enabling alarm-entity validation logic that had been left
commented out, and refreshing PORTAGE_REACTEUR.md to mark several
previously-blocking API divergences as already resolved.

- RodType: drop unused imports left over from the HolderSet→Holder
  migration (HolderSet, RegistryCodecs, NeoForgeRegistries,
  CNTags.CNItemTags, CNRodTypes)
- ReactorControllerInventory: simplify isItemValid() from a switch
  with a `default -> !super.isItemValid(...)` branch to a direct
  `slot == 0 && resource.is(CNItems.REACTOR_BLUEPRINT.get())` check —
  slot 0 is the only valid slot, so the switch's default branch was
  unreachable dead logic
- ReactorAlarmManager: uncomment and re-enable the
  ReactorAlarmEntity-based pruning in the stale-position cleanup and
  the loaded/valid-position filtering, restoring actual validation
  instead of leaving `positions`/`validPositions` unfiltered
- PORTAGE_REACTEUR.md: update the Forge→NeoForge reactor port
  tracking doc — mark the previously blocking API divergences
  (RodType shape, IHeat.HeatLevel reactor-size awareness,
  CReactorHeat config, CRods completeness) as resolved as of the
  batch-0 port work, with side-by-side verification notes dated
  2026-08-14
…er.properties timestamp

Refresh the reactor port tracking doc's gametest count from the
original 29 to the current 31 (regression tests for zero-heat
serialization and empty-slot pattern persistence/network sync were
added since, per Lot 2bis/9), and record run/server.properties'
auto-updated last-modified timestamp from a local dev server run.

- PORTAGE_REACTEUR.md: bump the reported `./gradlew runGameTestServer`
  pass count from 29 to 31 in the summary header, Lot 8, and §9.5;
  add a 2026-08-14 note explaining the count moved from 29 (after two
  bug-contract marker tests were removed) to 31 (after new regression
  tests were added), so the change reads as expanded coverage, not a
  regression
- run/server.properties: update the auto-generated header timestamp
  comment from "Fri Aug 07 17:41:43 CEST 2026" to
  "Fri Aug 14 21:51:07 CEST 2026" (written by Minecraft on local
  server start)
…set rods

An audit of content/multiblock/controller (documented in
PARITE_FORGE_NEOFORGE.md §7/§8) traced RodType.ratio() usage up to
its Builder and found ratio defaulted to null instead of the
constant-1 supplier the class's own Javadoc promises. build() passes
ratio through unchanged, so any RodType built without an explicit
.ratio(...) call throws an NPE the first time
ReactorHeatUpdateCoordinator calls rodType.ratio().get() during heat
balance calculation. Currently latent (all three real Builder usages
in CNItems set ratio explicitly), but a live trap for the next rod
added without it.

- RodType.Builder: default the `ratio` field to `() -> 1` instead of
  `null`, matching build()'s existing Javadoc claim that ratio is
  exempt from the required-fields check because it defaults to a
  constant 1
- CNCrushingRecipeGen: remove trailing blank lines at the end of the
  class body
- Add src/main/resources/META-INF/icon.png: the mod's icon,
  previously present on Forge but missing on NeoForge (flagged in
  PARITE_FORGE_NEOFORGE.md as the mods-screen showing no icon since
  neoforge.mods.toml references a nonexistent logo.png)
- PARITE_FORGE_NEOFORGE.md: refresh the Forge/NeoForge parity audit
  for 2026-08-14 — mark the Alex's Caves compat and client mixins as
  ported, mark SnowPowderRecipeGen's package divergence as resolved,
  add a new §7 line-by-line audit of content/multiblock/controller
  (41/41 files paired, 21 diverging but all either 1.21 API
  adaptation or cosmetic, one pre-existing dead-code note on
  ReactorControllerBlock's unused setValue(ASSEMBLED, false) call),
  document the RodType.ratio() bug found during that audit (fixed by
  this commit) as well as the still-open ReactorGaugeOverrides/
  IrradiatedWoldCollarLayer orphan files, the disabled
  CNShapelessRecipeGen provider, and the worsening `create`-namespace
  recipe leak in CNCrushingRecipeGen/CNWashingRecipeGen; renumber the
  "verify project state" section from §7 to §8 and update its
  expected file counts
…tale icon.png claim

Follow-up pass on PARITE_FORGE_NEOFORGE.md after the previous commit
fixed RodType.Builder.ratio's null default: reconcile the file/
resource counts, fold §8 into §7 (a numbering slip from the last
edit), and correct an inaccurate claim about the mod's icon that a
fresh check disproved.

- Update the top-of-file file/resource counts (302→301 .java files,
  1119→1120 resources) to match the current tree
- §7.3: replace the detailed bug write-up for RodType.Builder.ratio's
  null default with a short "fixed" note pointing at commit `970503b`,
  since the previous commit already applied the suggested fix
  (`private Supplier<Integer> ratio = () -> 1;`)
- Renumber the controller-audit subsections from §8.1–§8.4 to
  §7.1–§7.4, correcting a heading-numbering mistake from the prior
  edit (the section itself is titled "## 7. Audit ciblé...")
- Correct the mod-icon note: `src/main/resources/META-INF/icon.png`
  does exist on NeoForge (added in the previous commit) — the earlier
  claim that it was missing was wrong. Only `logo.png` (referenced by
  `logoFile` in neoforge.mods.toml) remains genuinely absent; flag
  that `logoFile` may just need to point at `icon.png` instead
- Note that `content/multiblock/frame/ReactorGaugeOverrides.java`
  (previously flagged as an orphaned file) has been removed from the
  codebase; remove it from the orphan-files table and the priority
  work list accordingly, updating the remaining
  IrradiatedWoldCollarLayer/logo.png work-list entries to reflect the
  one-less-file scope
- Update the §8 "verify project state" comment's expected orphan-file
  count from 15 (4+2+9) to 11 (3+3+5), matching the earlier §0 revision
Port reactor logic from Forge branch with enhancements and fixes
… into the create namespace

Create's ProcessingRecipeGen#create(Supplier<ItemLike>, ...) overload
defaults to Create's own namespace in 1.21, not the calling
generator's. CNCrushingRecipeGen and CNWashingRecipeGen relied on
that overload, so their generated JSON landed under
data/create/recipe/... instead of data/createnuclear/recipe/...,
silently overwriting Create's own recipes wherever the ids collided
(crushing/raw_copper, crushing/raw_zinc,
crushing/raw_uranium_block, splashing/crushed_raw_lead). Override the
single-ingredient create(...) method in both generators to force
CreateNuclear.MOD_ID as the namespace, and regenerate the affected
recipe JSON under the correct namespace. Also delete the unused
CNShapelessRecipeGen generator and fix the mod's logo reference.

- CNCrushingRecipeGen / CNWashingRecipeGen: override
  create(Supplier<ItemLike>, UnaryOperator<...>) to delegate to
  create(CreateNuclear.MOD_ID, singleIngredient, transform), pinning
  every recipe generated through the single-ingredient convenience
  overload to the createnuclear namespace
- Move the crushing recipes for granite, raw_copper, raw_thorium,
  raw_thorium_block, raw_uranium_block, raw_zinc, and the splashing
  recipe for crushed_raw_lead from
  src/generated/resources/data/create/recipe/ to
  src/generated/resources/data/createnuclear/recipe/, matching the
  fixed namespace
- Delete foundation/data/recipe/CNShapelessRecipeGen.java (504 lines):
  its registration in CreateNuclearDatagen was already commented out,
  so its shapeless recipes (including cloth items) were never
  produced; remove the dead generator along with the now-unused
  CreateMechanicalCraftingRecipeGen/CreateRecipeProvider imports it
  required in CreateNuclearDatagen
- neoforge.mods.toml: point `logoFile` at the mod's actual icon
  (`icon.png`) instead of the nonexistent `logo.png`; quote the
  `[[dependencies.${mod_id}]]` table headers as
  `[[dependencies."${mod_id}"]]` (TOML requires quoting a key that
  isn't a bare identifier once it contains variable substitution
  syntax); add blank lines between TOML sections for readability
…E_FORGE_NEOFORGE.md

Follow-up documentation pass after the previous commit fixed
CNCrushingRecipeGen/CNWashingRecipeGen leaking recipes into Create's
namespace: update the tracking doc's status line and replace the
"still broken, getting worse" warning in §3.1 with a resolved note
explaining the fix, then remove the item from the priority work list.

- Update the top-of-file status line: date 14→15 August 2026, branch
  V2-Reacteur→V2, and add the namespace-leak fix to the list of work
  already landed
- §3.1: replace the ⚠️ warning about CNCrushingRecipeGen/
  CNWashingRecipeGen leaking recipes into data/create/recipe/ with a
  ✅ resolved note pointing at commit `93975b3` — explain the root
  cause (Create's 2-arg `create(Supplier<ItemLike>, ...)` overload
  hardcodes `Create.ID` rather than the calling generator's
  namespace), the fix applied (overriding that single overload per
  generator to delegate to the 3-arg `create(CreateNuclear.MOD_ID, ...)`
  form), and verification performed (regenerated datagen output, plus
  an audit confirming the other 10 recipe generators in the project
  don't share the bug); note CNStandardRecipeGen.createSpecial()'s
  unrelated Create.asResource(...) hardcode as dead code with no
  in-game impact, found in passing during that audit
- §5 (chantier priority table): remove the now-resolved "namespace
  create des recettes crushing/washing" row, renumber the remaining
  four rows, and add a note that this item was resolved by commit
  `93975b3` and dropped from the list
…provider registration

neoforge.mods.toml's `logoFile` is resolved by NeoForge relative to
the jar root (alongside assets/, data/), not relative to META-INF/
where the toml itself lives — so pointing logoFile at "icon.png" while
the image sat in src/main/resources/META-INF/icon.png left it
unresolvable at runtime despite existing in the repo. Move the icon
to the resources root to match the NeoForge/Forge MDK convention, and
drop a leftover commented-out provider registration line documented
as already resolved (the CNShapelessRecipeGen generator itself was
deleted in a prior commit).

- Move src/main/resources/META-INF/icon.png to
  src/main/resources/icon.png so `logoFile = "icon.png"` in
  neoforge.mods.toml actually resolves
- CreateNuclearDatagen: remove the stray commented-out
  `generator.addProvider(event.includeServer(), new CNShapelessRecipeGen(...))`
  line — the referenced class no longer exists after its removal in
  commit `93975b3`
- PARITE_FORGE_NEOFORGE.md: document the actual root cause of the
  logoFile resolution failure (relative to jar root, not to
  META-INF/) and its fix; mark CNShapelessRecipeGen as deleted rather
  than reconnected (it was dead code from the start, so no shapeless
  recipes were lost); remove both items from the §2.2 orphan-file
  table and the §5 priority work list, replacing them with ✅
  resolved notes
…put pitfall

Follow-up to the previous commit that moved icon.png to the resources
root: mark the logoFile fix as verified working, and record an
unrelated IDE gotcha discovered while confirming it, so it doesn't
get rediscovered from scratch later.

- PARITE_FORGE_NEOFORGE.md §2.2: change the logoFile note from ⚠️
  "still broken" to ✅ "fixed", keeping the same root-cause
  explanation (NeoForge resolves logoFile relative to the jar root,
  not to META-INF/)
- Add a note that IntelliJ's `bin/main` compilation output (distinct
  from Gradle's `build/`) can serve a stale copy of
  neoforge.mods.toml/resources if the run configuration loads that
  output instead of `build/resources/main`, and that a full Rebuild
  Project (or switching IntelliJ's "Build and run using" setting to
  Gradle) is needed for resource changes to actually show up in-game
  — flagged as unrelated to the Forge/NeoForge port itself, kept here
  for future "the file is right but nothing changed" debugging
…ag, and extract shared AnimalUtil helpers

Add a fourth irradiated animal (cow, alongside cat/chicken/wolf),
following the same registration pattern in CNEntityType, and pull the
food-check logic shared with the other irradiated animals into a new
AnimalUtil class. Also rename the anti-radiation helmet detection tag
from a dye-specific name to a general one, since HelmetOverlay only
needs to know "is this an anti-radiation helmet", not "is it
fully dyed".

- Add content/contraptions/irradiated/cow/IrradiatedCow(.java),
  IrradiatedCowModel, IrradiatedCowRenderer: a new tameable-in-future
  irradiated cow entity (milk bucket interaction, breeding, cow
  ambient/hurt/death/step sounds, fed via CNItems.YELLOWCAKE)
- Add content/contraptions/irradiated/AnimalUtil: extracts
  isFood(ItemStack, Ingredient[, Predicate<ItemStack>]) (yellowcake
  always counts as food, plus the animal's own food ingredient/extra
  test) and blockTamingWip(Player, Level) (sends a "taming is WIP"
  chat message and consumes the interaction) for reuse across
  irradiated animals
- CNEntityType: register IRRADIATED_COW (CREATURE category, 0.6x0.85
  hitbox, IRRADIATED_IMMUNE tag, IrradiatedCowRenderer, custom
  attributes) and its model layer via CNModelLayers.IRRADIATED_COW;
  fix indentation on IRRADIATED_CAT/IRRADIATED_WOLF field declarations
  and the registerModelLayer() body (inconsistent 3-space indent)
- CNModelLayers: add the IRRADIATED_COW model layer registration
- Add generated loot table data/createnuclear/loot_table/entities/irradiated_cow.json
  and add createnuclear:irradiated_cow to the generated
  irradiated_immune entity_type tag
- CNTags: rename the ANTI_RADIATION_HELMET_FULL_DYE item tag to
  ANTI_RADIATION_HELMET
- CNItems: tag the anti-radiation helmet item with the renamed
  CNItemTags.ANTI_RADIATION_HELMET.tag (in addition to
  ANTI_RADIATION_ARMOR.tag and the forge armors/helmets tag)
- HelmetOverlay: check the renamed
  CNItemTags.ANTI_RADIATION_HELMET.tag instead of the removed
  ANTI_RADIATION_HELMET_FULL_DYE.tag when deciding whether to hide
  the vanilla helmet overlay
- Replace the generated
  data/createnuclear/tags/item/anti_radiation_helmet_full_dye.json
  with anti_radiation_helmet.json, matching the tag rename
- Regenerate en_us.json/en_ud.json language files with the new
  "Irradiated Cow" entry
…and fix a stale particle path

The anti-radiation armor item models referenced their texture under
item/, but that path isn't stitched into an atlas the item-model
renderer looks up at that texture id, so the armor pieces likely
rendered with a missing-texture fallback. Register a
models/armor/ directory source in the blocks atlas and repoint the
four armor item models at it. Also fix the fluid input's vertical
block model, whose particle texture pointed at a nonexistent
block/reactor/input/input path instead of the actual
block/reactor/fluid_input/input texture.

- assets/minecraft/atlases/blocks.json: add a "directory" source
  stitching models/armor/ (prefixed models/armor/) into the blocks
  atlas, alongside the existing single fluid/nitrogen_still entry
- default_anti_radiation_boots/chestplate/leggings/item.json: repoint
  the "14" texture entry from createnuclear:item/default_anti_radiation_suit
  to createnuclear:models/armor/default_anti_radiation_suit
- default_anti_radiation_helmet/item.json: repoint both the "layer0"
  and "particle" texture entries the same way
- block/reactor/fluid_input/fluid_input_vertical.json: fix the
  "particle" texture reference from
  createnuclear:block/reactor/input/input (nonexistent) to
  createnuclear:block/reactor/fluid_input/input (the actual texture
  used by texture key "0" in the same model)
…d default-texture reference

Follow-up to the previous commit that fixed the missing anti-radiation
armor icons: write up the full root-cause analysis in
PARITE_FORGE_NEOFORGE.md — why the textures were missing, why Forge's
divergent approach (duplicating textures under textures/item/armors/)
isn't being replicated here, and the atlas-syntax pitfall hit while
authoring the fix.

- PARITE_FORGE_NEOFORGE.md: add §3.2 "Icônes d'inventaire des armures
  anti-radiation colorées — divergence assumée avec Forge", covering:
  - the symptom (ModelManager logging missing-texture warnings for
    all 16 colored armor inventory icons at startup, despite the PNGs
    existing on disk at the right size) and that it was not the
    IntelliJ bin/main staleness pitfall noted in §2.2 despite the
    similar symptom
  - the root cause: models/armor/ is never a default sprite source
    for the minecraft:blocks atlas (unlike textures/block/ or
    textures/item/), since it's normally only loaded via direct GL
    binding for the worn armor layer, not atlas lookup for 3D
    Blockbench item models — explaining why Forge instead duplicates
    these 16 textures under textures/item/armors/
  - the fix taken here (adding models/armor as a directory source to
    assets/minecraft/atlases/blocks.json instead of duplicating
    textures), and that per-resource-pack atlas sources add up rather
    than override each other
  - a JSON-structure pitfall hit while writing that atlas file
    (nesting the source entry under a sources object instead of
    putting `type` directly in the root `sources` array), which broke
    parsing and silently regressed the already-working fluid sprite
    entries — flagged for anyone editing this file again
  - a second, separate dead-reference bug found and fixed in the same
    pass: the 4 base Blockbench armor item models pointed their
    default texture at a nonexistent createnuclear:item/
    default_anti_radiation_suit path (present identically, and
    equally dead, on Forge) — harmless since those base models are
    only ever used as a parent for the 16 colored overrides, but
    corrected to point at the real
    createnuclear:models/armor/default_anti_radiation_suit path
…layer

Flagged as dead code in PARITE_FORGE_NEOFORGE.md §2.2: this render
layer (note the "Wold"/"Wolf" typo in its own name) was a started,
never-finished attempt at a tinted collar for the tamed irradiated
wolf — its render() method was an empty no-op, and it was never
registered via addLayer(...) on IrradiatedWolfRenderer, so it had no
effect at runtime and doesn't exist on Forge. Remove it rather than
finish the feature.

- Delete content/contraptions/irradiated/wolf/IrradiatedWoldCollarLayer.java
…, fold layer registration into CNClientEvent

CommentEventClients existed solely to forward
EntityRenderersEvent.RegisterLayerDefinitions to
CNEntityType.registerModelLayer(...), duplicating the client-event
subscriber role already served by CNClientEvent. Merge the two by
moving that single @SubscribeEvent method into CNClientEvent and
deleting the now-empty class.

- Delete foundation/events/CommentEventClients.java
- CNClientEvent: add the registerLayers(EntityRenderersEvent.RegisterLayerDefinitions)
  @SubscribeEvent method (delegating to CNEntityType.registerModelLayer(event)),
  moved over from the deleted class; add the corresponding
  EntityRenderersEvent import, and collapse the four
  net.nuclearteam.createnuclear.CN*/CreateNuclear imports into a
  single wildcard import
- PARITE_FORGE_NEOFORGE.md: update the Forge/NeoForge parity tracking
  doc — mark the irradiated cow port (commit `5350638`) and the
  IrradiatedWoldCollarLayer removal (commit `4918bf7`) as done, refine
  §2.1 to note that AnimalUtil only covers isFood()/blockTamingWip()
  and the full IrradiatedAnimal base-class abstraction is still
  outstanding (IrradiatedCat/IrradiatedWolf still duplicate behavior),
  document the anti-radiation armor atlas fix in §3.2, and refresh the
  top-of-file file/resource counts and the "verify project state"
  orphan-file count (11→7) accordingly
Follow-up to the previous commit that folded CommentEventClients into
CNClientEvent and deleted it: record why in
PARITE_FORGE_NEOFORGE.md §2.2, clarifying it wasn't dead code (its
@EventBusSubscriber-registered layer registration was load-bearing
for irradiated cat/chicken/wolf/cow rendering) but a structural
oddity — a likely "CommonEventClients" typo, split out with no Forge
equivalent, where Forge instead keeps that registration directly in
CNClientEvent.registerLayers alongside the rest of client
registration.

- PARITE_FORGE_NEOFORGE.md §2.2: add a note explaining the
  CommentEventClients merge/removal — not dead code, but a
  Forge-divergent file split (likely a "CommonEventClients" typo)
  now resolved by moving registerLayers(...) into CNClientEvent to
  match Forge's structure
…`c` tag conventions

Replace CNBlocks' hand-rolled createnuclear-namespace ore/storage-block
tags (CNBlockTags.LEAD_ORES/URANIUM_ORES/THORIUM_ORES and their
forgeBlockTag "ores"/"ores_in_ground/*"/"storage_blocks" duplicates)
with NeoForge's standard Tags.Blocks/Tags.Items constants
(Tags.Blocks.ORES, ORES_IN_GROUND_DEEPSLATE/STONE, STORAGE_BLOCKS, and
their item equivalents), fix a thorium-block loot table bug found
along the way, move block render types from Java registration to
per-model JSON, and reformat CNBlocks to consistent indentation.

- CNBlocks: for every ore/raw-storage/storage block (uranium, lead,
  thorium, nitrate deepslate+stone variants; raw_uranium_block,
  raw_lead_block, raw_thorium_block, lead_block, thorium_block,
  steel_block), tag with `Tags.Blocks.ORES`/`Tags.Blocks.ORES_IN_GROUND_DEEPSLATE`/
  `Tags.Blocks.ORES_IN_GROUND_STONE`/`Tags.Blocks.STORAGE_BLOCKS` and
  the matching `Tags.Items.*` on the item side, instead of the
  removed CNBlockTags/CNItemTags LEAD_ORES/URANIUM_ORES/THORIUM_ORES
  and forgeBlockTag/forgeItemTag("ores")/("storage_blocks") variants
- Fix THORIUM_BLOCK's loot table: it dropped `raw_uranium` (with a
  fortune bonus) via an `alternatives` entry instead of dropping
  itself — the block now has a plain self-drop entry gated on
  `survives_explosion`, matching the other storage blocks
- REINFORCED_GLASS: tag with `Tags.Blocks.GLASS_BLOCKS`/`Tags.Items.GLASS_BLOCKS`
  instead of the custom `forgeBlockTag`/`forgeItemTag("glass_blocks")`;
  raise explosionResistance from 7.0F to 1200.0F (matching vanilla
  reinforced deepslate/obsidian-tier blast resistance, not a normal
  glass block anymore)
- ENRICHING_CAMPFIRE: drop the `.tag(BlockTags.CAMPFIRES)` call from
  CNBlocks and instead register it via
  CreateNuclearRegistrateTags.genBlockTags() (`prov.tag(BlockTags.CAMPFIRES).add(...)`),
  consistent with how the fire-tag registration for ENRICHING_FIRE is
  already handled there
- Remove `.addLayer(() -> RenderType::cutout/cutoutMipped/translucent)`
  Registrate calls for REACTOR_FRAME, ENRICHING_FIRE, REACTOR_ROD_INPUT,
  REACTOR_FLUID_INPUT, and REINFORCED_GLASS; add the equivalent
  `"render_type"` field directly to the affected block/item model
  JSON files (enriching/fire/{floor0,floor1,side0,side1,side_alt0,side_alt1}.json,
  reactor/rod_input/{item,rod_input,rod_input_vertical}.json) — the
  1.21 render-type-in-model mechanism replacing the old Java-side
  registration
- CNTags: remove the now-unused THORIUM_ORES/URANIUM_ORES/LEAD_ORES
  CNBlockTags entries
- Reformat CNBlocks' block/item registration chains to consistent
  4-space Registrate-builder indentation throughout (no functional
  change beyond the tag/render-type edits above)
- Regenerate the affected tag/loot-table JSON under
  data/c/tags/{block,item}/... (new common ore/storage-block tags),
  data/createnuclear/tags/{block,item}/{lead,uranium,thorium}_ores.json
  (item tags kept, block tags deleted), and
  data/minecraft/tags/block/{mineable/pickaxe,needs_diamond_tool,needs_iron_tool}.json
- Add .editorconfig: LF line endings, final newline, space indentation
  (4 spaces for .java)
…itself

The shapeless cloth-dye recipe required the createnuclear:cloth tag
(matching any color) as the base ingredient, so e.g. white cloth +
white dye validly crafted white cloth — a no-op recipe reachable in
survival. Require any color except the target color instead. Also
tag several items with NeoForge's common `c` tags where a
project-specific forge tag was used redundantly.

- CNItems: for the cloth crafting recipe, replace the
  `.requires(CNItemTags.CLOTH.tag)` base ingredient with
  `.requires(Ingredient.of(...))` built from every DyeColor except the
  target color, resolved via ClothItem.Cloths.getByColor(...) — a
  cloth item can no longer be crafted from itself
- Regenerate the 16 shapeless/cloth/*.json recipes with the new
  15-color ingredient list instead of the createnuclear:cloth tag
- CNItems: tag RAW_URANIUM/RAW_LEAD/RAW_THORIUM with
  Tags.Items.RAW_MATERIALS, URANIUM_POWDER/COAL_DUST/THORIUM_DUST with
  Tags.Items.DUSTS, STEEL_INGOT/LEAD_INGOT/THORIUM_INGOT with
  Tags.Items.INGOTS, STEEL_NUGGET/LEAD_NUGGET/THORIUM_NUGGET with
  Tags.Items.NUGGETS, URANIUM_ROD/GRAPHITE_ROD/THORIUM_ROD with
  Tags.Items.RODS, and all four anti-radiation armor pieces with
  Tags.Items.ARMORS — in each case in addition to, not replacing, the
  existing project-specific forgeItemTag
- Add generated data/c/tags/item/armors.json listing the four
  anti-radiation armor items under the new common tag
…ION_BIOME_EXTRACTOR

Purely cosmetic re-indentation of the last two item registrations in
CNItems (8-space Registrate-builder chains reduced to 4 spaces),
matching the indentation already used throughout the rest of the
file. No functional change.

- CNItems: reformat the REINFORCED_GLASS_BOTTLE and
  IRRADIATION_BIOME_EXTRACTOR item registration chains
…he reactor alarm recipe

Follow-up to PARITE_FORGE_NEOFORGE.md §3.1's "reste à traiter" list:
fill in the three recipes flagged as still missing on NeoForge —
thorium fluid mixing, thorium metal compacting, and the reactor
alarm's mechanical crafting recipe — so thorium's fluid/metal chain
and the reactor alarm are actually craftable, not just obtainable via
creative. Also swap several tag-based recipe lookups from
now-removed CNItemTags entries to the equivalent forgeItemTag, and
tag nitrogen fluid under the water fluid tag.

- CNMixingRecipeGen: add THORIUM_FLUID, mixing dusts/thorium into
  25mB of CNFluids.THORIUM under HeatCondition.HEATED, mirroring the
  existing uranium fluid recipe
- CNCompactingRecipeGen: add THORIUM (compacting 200mB of thorium
  fluid into a thorium ingot); switch YELLOWCAKE's ingredient from a
  direct CNFluids.URANIUM.get() reference to the CNFluidTags.URANIUM
  tag, matching how THORIUM's own ingredient is already tag-based;
  drop the now-unused CNFluids import
- CNStandardRecipeGen: add THORIUM_COMPACTING
  (nugget/ingot/block compacting chain for thorium, alongside the
  existing lead/steel chains); switch
  URANIUM_ORE_TO_URANIUM_POWDER/RAW_LEAD_ORES from the removed
  CNItemTags.URANIUM_ORES/LEAD_ORES tags to
  CNTags.forgeItemTag("ores/uranium")/("ores/lead")
- CNMechanicalCraftingRecipeGen: add REACTOR_ALARM, a mechanical
  crafting recipe for CNBlocks.REACTOR_ALARM (casing, note blocks,
  repeaters, and a clock); fix an existing recipe's 'B' key, which
  referenced CNFluids.URANIUM.get().getBucket() (an item that doesn't
  exist as a standalone bucket entry) to use the vanilla Items.BUCKET
  instead
- CreateNuclearRegistrateTags: tag CNFluidTags.NITROGEN under
  FluidTags.WATER
- CNTags: remove the now-unused URANIUM_ORES/LEAD_ORES CNItemTags
  entries (their consumers were just migrated to forgeItemTag above)
- Regenerate the affected recipe/advancement JSON for the blasting/
  smelting lead and uranium ore recipes, the uranium-to-yellowcake
  compacting recipe, and the reactor frame mechanical crafting
  recipe; add the new thorium_fluid, thorium_block_from_compacting,
  thorium_ingot_from_compacting/decompacting,
  thorium_nugget_from_decompacting, and reactor_alarm recipe/
  advancement JSON; add data/minecraft/tags/fluid/water.json (now
  includes createnuclear:nitrogen); delete the orphaned
  tags/item/lead_ores.json and uranium_ores.json generated files
- AUDIT_NEOFORGE.md: flag three CNCrushingRecipeGen content
  differences from Forge found during this pass (a new
  RAW_URANIUM_BLOCK crushing recipe with no Forge equivalent, and two
  changed secondary-drop chances/items for RAW_THORIUM_BLOCK/RAW_THORIUM_ITEM)
  as open questions to resolve later, not yet fixed
…it into the chicken, and align the cat with vanilla Cat

Deliver the "IrradiatedAnimal" abstraction flagged as outstanding in
PARITE_FORGE_NEOFORGE.md §2.1: a shared default-method interface for
converting an irradiated animal back into its vanilla counterpart
(same pattern as zombie villager curing), wired into IrradiatedChicken
first. Separately, rewrite IrradiatedCat's AI to closely track
vanilla Cat's own goal/behavior implementation instead of duplicating
it in project-specific goal classes, and delete the three custom cat
goals that duplication required.

- Add content/contraptions/irradiated/IrradiatedAnimal: an interface
  with a static EntityType→EntityType VANILLA_TO_IRRADIATED map and
  default methods startConverting(int)/finishConversion(ServerLevel)/
  getConversionProgress() driving a conversion sequence (damage-boost
  effect, EntityEvent.ZOMBIE_CONVERTING broadcast, convertTo(...),
  confusion effect, SOUND_ZOMBIE_CONVERTED) mirroring vanilla's
  zombie-villager-cure mechanic; implementers supply
  getNormalVariant()/isConverting()/setConverting()/
  setConversionTime(int)/getConversionTime(), and optionally override
  readFromVanilla(Animal)/writeToVanilla(Animal) to carry state across
  the conversion
- IrradiatedChicken: implement IrradiatedAnimal — add a synced
  DATA_CONVERTING_ID flag, conversionTime field,
  getNormalVariant() returning EntityType.CHICKEN, and
  read/writeFromVanilla(...) syncing the isChickenJockey flag; also
  port vanilla Chicken behavior that was previously missing: periodic
  egg-laying (eggTime field, egg spawn/sound/GameEvent.ENTITY_PLACE
  on tick), chicken-jockey removeWhenFarAway()/getBaseExperienceReward()
  handling, and persisting IsChickenJockey/EggLayTime/ConversionTime
  via read/addAdditionalSaveData
- CreateNuclear: during common setup, enqueue registering
  EntityType.CHICKEN → CNEntityType.IRRADIATED_CHICKEN in
  IrradiatedAnimal.VANILLA_TO_IRRADIATED
- IrradiatedCat: rewrite registerGoals()/mobInteract()/canMate()/
  getBreedOffspring()/finalizeSpawn() to mirror vanilla Cat's current
  implementation more closely — use vanilla's own CatTemptGoal/
  CatAvoidEntityGoal/CatRelaxOnOwnerGoal instead of the project's
  duplicated IrradiatedCatTemptGoal/IrradiatedCatAvoidEntityGoal/
  IrradiatedCatRelaxOnOwnerGoal; add a PanicGoal; getBreedOffspring()
  now spawns a vanilla Cat (carrying over tame/owner state) instead of
  another IrradiatedCat; canMate() now checks against any Cat rather
  than only IrradiatedCat; finalizeSpawn() adds the
  CATS_SPAWN_AS_BLACK structure-tag persistence check; mobInteract()
  rewritten with an explicit client-side branch matching vanilla's
  structure; add doHurtTarget(Entity)/getAttackDamage()
- Delete the now-unused
  content/contraptions/irradiated/cat/IrradiatedCatAvoidEntityGoal.java,
  IrradiatedCatRelaxOnOwnerGoal.java, and IrradiatedCatTemptGoal.java
- CatLieOnBedGoal / CatSitOnBlockGoal: rename the `irradiatedCat`
  field to `cat` throughout, and reformat isValidTarget()'s bed/
  furnace lookup for readability (no behavior change)
…s and complete the CNBlocks/CNItems parity audit

A full line-by-line audit of CNBlocks and CNItems against Forge
(closing the "continuous" work item in PARITE_FORGE_NEOFORGE.md §5)
found that uranium_ore, deepslate_uranium_ore, lead_ore, and
deepslate_lead_ore had lost their base SetItemCountFunction drop
range during the Enchantments.BLOCK_FORTUNE → 1.21
Enchantments.FORTUNE port — they fell back to vanilla iron/gold-style
single-item drops (via ApplyBonusCount.addOreBonusCount alone)
instead of Forge's guaranteed 3–4 (uranium) / 2–4 (lead) raw-material
range, unlike thorium_ore which kept its set_count correctly. Restore
the missing SetItemCountFunction call on all four loot tables. The
audit also confirmed several apparent gaps were false positives, not
bugs.

- CNBlocks: add back
  `.apply(SetItemCountFunction.setCount(UniformGenerator.between(3.0F, 4.0F)))`
  before the fortune bonus on uranium_ore/deepslate_uranium_ore, and
  `.between(2.0F, 4.0F)` on lead_ore/deepslate_lead_ore, matching
  Forge's drop ranges
- Regenerate the affected loot table JSON
  (deepslate_lead_ore/deepslate_uranium_ore/lead_ore/thorium_ore/uranium_ore.json)
- PARITE_FORGE_NEOFORGE.md: record the full CNBlocks/CNItems audit
  (§3.3) — confirm 1:1 block/item list parity (27 blocks, 29 items on
  each side); clear up the six blocks whose Forge-side
  `.addLayer(() -> RenderType::X)` calls appeared missing on NeoForge
  — verified they were correctly replaced by a per-model
  `"render_type"` JSON field (the 1.21 mechanism), not dropped; note
  a remaining, unfixed divergence where the fortune-bonus formula
  (`ore_drops` vs Forge's `uniform_bonus_count`) still differs on the
  affected ores even after this fix, flagged for follow-up if a
  player reports an odd fortune yield; log a few other reviewed,
  harmless divergences (redundant setCreativeTab call, the
  ANTI_RADIATION_HELMET tag being NeoForge-only but alive, and
  data-component-related typing differences already covered
  elsewhere in the doc); update the top-of-file status line, file/
  resource counts, and the §3.2/§5 tracking tables and priority list
  to reflect this pass and the previously-landed IrradiatedAnimal
  work (commit `7d16431`) — PARITE_FORGE_NEOFORGE.md's tracked
  feature-parity backlog is now empty, only the continuous CNBlocks/
  CNItems audit item remains by nature
…de to Modrinth, and fix HUD depth-mask occlusion

Three related fixes bundled together: the anti-radiation armor pieces
never had CNArmorMaterials.durabilityForType(...) applied to their
item builders, so they used the default (zero) durability, which also
caused HelmetOverlay's durability-ratio calculation to divide by
zero; RenderHelper's full-screen overlay blit never touched the depth
state, which harmlessly no-op'd under Forge's old GUI pipeline but
occludes other mods' HUD layers (e.g. Jade) under NeoForge's
GuiLayerManager z-ordering; and Jade was pulled from a pinned
CurseForge build id instead of Modrinth's Maven, which is more
reproducible and doesn't require a Curse API token.

- Rename content/equipment/armor/ArmorMaterials.java to
  CNArmorMaterials.java (was shadowing vanilla
  net.minecraft.world.item.ArmorMaterials without the project's usual
  CN-prefix naming convention for such deliberately-vanilla-shadowing
  classes)
- CNArmorMaterials: add setArmorDurability(Type, int factor) and a
  setArmorDurability(Type) overload (factor defaulting to 15),
  returning a NonNullUnaryOperator<ItemBuilder<T, P>> that sets
  `p.durability(type.getDurability(factor))` — usable directly as a
  Registrate `.transform(...)` step; adjust the existing
  durabilityForType(...)/register(...) signatures to use the
  now-imported ArmorItem.Type alias
- CNItems: apply
  `.transform(CNArmorMaterials.setArmorDurability(Type.HELMET/CHESTPLATE/LEGGINGS/BOOTS))`
  to each of the four anti-radiation armor item builders, so they
  finally get real durability instead of the default
- AntiRadiationArmorItem, CreateNuclear: update references from
  ArmorMaterials to the renamed CNArmorMaterials
- RenderHelper.renderOverlay(...): wrap the full-screen texture blit
  with RenderSystem.disableDepthTest()/depthMask(false) before and
  enableDepthTest()/depthMask(true) after, so a fully opaque overlay
  (e.g. the anti-radiation helmet HUD) no longer occludes other mods'
  post-layer HUD elements (observed with Jade) via depth testing
  under NeoForge's GuiLayerManager
- HelmetOverlay: minor whitespace cleanup (blank line before the
  durability-ratio comment)
- build.gradle / gradle.properties: replace the pinned
  `curse.maven:jade-324717:6291517` dependency and `jade_id` property
  with `maven.modrinth:jade:${jade_version}` resolved via a new
  `https://api.modrinth.com/maven` repository, and a `jade_version`
  property (`15.10.6+neoforge`)
- AUDIT_NEOFORGE.md: mark the RenderHelper depth-state issue as found,
  explained (Forge's old painter's-algorithm GUI pipeline vs
  NeoForge's GuiLayerManager depth-tested layers), fixed, and
  in-game-tested
- PARITE_FORGE_NEOFORGE.md: update the reference to the renamed
  ArmorMaterials → CNArmorMaterials class in the "names shadowing a
  vanilla class" note
…ti-radiation helmet as a Create goggle, and audit 5 previously-unreviewed files

Continuation of the CNAdvancement work: this time also register the
anti-radiation helmet with Create's GogglesItem so goggle-gated
tooltips (e.g. Create's stress/kinetic overlays) recognize it as
goggle-equivalent, matching what wearing it should unlock. Also
complete the line-by-line audit PARITE_FORGE_NEOFORGE.md's §3 table
had left as "non revérifié" since 14 August, covering CNAdvancement,
CNStandardRecipeGen, CreateNuclearJEI, RadiationCapability, and
IrradiatedWolf — finding two real, undecided gameplay divergences
(the disabled advancements themselves, and IrradiatedWolf missing a
panic goal while having gained a full taming/armor system Forge
deliberately keeps WIP-blocked) alongside two divergences explicitly
accepted as intentional.

- CNAdvancement: uncomment ANTI_RADIATION_ARMOR/AVOIDING_CANCER/
  DYE_ANTI_RADIATION_ARMOR and REACTOR_ROD_INPUT/REACTOR_FLUID_INPUT
  (6 advancements total, previously commented out with no compile
  error since the surrounding chained-field syntax stayed valid)
- Add a FULL_ARMOR EntityEquipmentPredicate (head/chest/legs/feet all
  matching the mod's anti-radiation armor items) and rewrite
  AVOIDING_CANCER's externalTrigger to build an
  InventoryChangeTrigger.TriggerInstance directly via
  CriteriaTriggers.INVENTORY_CHANGED.createCriterion(...) checking an
  EntityPredicate.wrap(...) of the player wearing FULL_ARMOR, instead
  of the removed InventoryChangeTrigger.TriggerInstance.hasItems(...)
  helper (which only checked inventory contents, not equipped slots)
- Minor formatting cleanup: reflow the PREDICATES list indentation and
  drop a few stray blank lines between advancement entries
- Regenerate the six new advancement JSON files (anti_radiation_armor,
  avoiding_cancer, dye_anti_radiation_armor, feeding_the_reactor,
  fueling_the_reactor, unlimited_power) and update the generated
  en_us.json/en_ud.json lang files with their titles/descriptions
- CreateNuclear: call
  GogglesItem.addIsWearingPredicate(AntiRadiationArmorItem.IGoggleHelmet::isGoggleHelmet)
  during common setup, registering the anti-radiation helmet as a
  valid "wearing goggles" source for Create's GogglesItem checks
- PARITE_FORGE_NEOFORGE.md: add §3.4, a full audit of CNAdvancement,
  CNStandardRecipeGen, CreateNuclearJEI, RadiationCapability, and
  IrradiatedWolf — document the 6 disabled advancements as an
  unresolved real bug (§3.4.1); confirm CNStandardRecipeGen's 6 extra
  decompacting recipes (lead/steel/thorium) and RadiationCapability's
  persisting contagionDose/contagionTicks (Forge never persists them)
  as intentional, closed divergences (§3.4.2/§3.4.4); confirm
  CreateNuclearJEI is a healthy superset of Forge with the
  snow-powder JEI category correctly wired (§3.4.3); document
  IrradiatedWolf's defineSynchedData as safe (unlike the earlier
  IrradiatedCat regression) but flag a missing WolfPanicGoal and a
  fully-implemented taming/armor system that Forge deliberately keeps
  WIP-blocked, needing an explicit scope decision (§3.4.5); confirm
  bluePrintItem/ was already covered by PORTAGE_REACTEUR.md's Lot
  2bis rather than left unaudited, and that the api/data/recipe/
  EnrichedRecipeGen "vestige" flagged earlier is alive and correctly
  wired, not dead code; update the top-of-file status line and the
  §3/§5 tracking tables and priority list with three new work items
  (re-enable the advancements, decide the wolf taming/armor scope,
  restore the wolf panic goal)
…t the AVOIDING_CANCER trigger pitfall

Follow-up to the previous commit that re-enabled the 6 disabled
advancements: update PARITE_FORGE_NEOFORGE.md's §3.4.1 finding from
"real bug, unresolved" to "fixed", and record the CriterionTrigger.getId()
API pitfall discovered while fixing AVOIDING_CANCER's trigger, plus
refresh the doc's summary/status/tracking sections to match.

- Update the top-of-file status summary: 3 of the 4 audit findings
  (RadiationCapability persistence, CNStandardRecipeGen's extra
  decompacting recipes, and now CNAdvancement) are resolved; only
  IrradiatedWolf still has open, undecided work
- §0's file/resource-status table: mark
  foundation/advancement/CNAdvancement as ✅ fixed instead of ⚠️
  unresolved
- §3.4.1: rewrite the finding as resolved — explain that
  CriterionTrigger.getId() no longer exists in the 1.21 API (triggers
  are identified via their registry, not a self-reported id), so the
  original Forge-era AVOIDING_CANCER trigger
  (`new PlayerTrigger.TriggerInstance(CriteriaTriggers.INVENTORY_CHANGED.getId(), ...)`,
  itself a 1.16–1.20 workaround) had to be rebuilt as
  CriteriaTriggers.INVENTORY_CHANGED.createCriterion(new InventoryChangeTrigger.TriggerInstance(...)),
  matching the pattern already used elsewhere in the file; note that
  compileJava and runData both pass but in-game triggering hasn't
  been tested yet
- §4 (pending in-game verifications): add a row for the 6 re-enabled
  advancements, flagging AVOIDING_CANCER's rewritten trigger as
  specifically needing an in-game check
- §5 (priority work list): drop the now-resolved "uncomment the 6
  disabled advancements" item, renumber the remaining IrradiatedWolf/
  CNBlocks-CNItems-audit items, and add a ✅ resolved note summarizing
  the CNAdvancement fix
…aming and restore the missing panic goal

Line-by-line audit of IrradiatedWolf (started 16 August, see
PARITE_FORGE_NEOFORGE.md §3.4.5) found the NeoForge port had silently
grown a full taming/wolf-armor subsystem that Forge deliberately keeps
disabled, while losing a vanilla goal in the process. This fixes both,
and uncovers a broader 1.21 API pitfall (dead getStandingEyeHeight
override) hit while fixing the eye-height regression that came with it.

- IrradiatedWolf: remove the entire taming/armor subsystem not present
  in Forge (tryToTame, EventHooks.onAnimalTame, canUseSlot,
  actuallyHurt, canArmorAbsorb, hurtArmor, hasArmor) and its now-dead
  imports (ItemParticleOption, DamageTypeTags, ItemAbilities,
  EnchantmentHelper/EnchantmentEffectComponents, Ingredient,
  EventHooks); rewrite mobInteract on Forge's model so feeding an
  untamed wolf calls AnimalUtil.blockTamingWip(player, level()) instead
  of attempting to tame it
- IrradiatedWolf: reintroduce the missing WolfPanicGoal (priority 1,
  panics on isFreezing()/isOnFire()), copied from Forge
- IrradiatedWolf: revert TAME_HEALTH from 40.0F back to 20.0F to match
  Forge now that the armor subsystem (which justified the higher
  value) is gone; getHurtSound/applyTamingSideEffects simplified
  accordingly
- IrradiatedWolf: fix canBeLeashed to call super.canBeLeashed() (the
  1.21 signature dropped the Player parameter entirely, so this wasn't
  a missing override — the super call itself was just missing)
- IrradiatedWolf: remove the dead getStandingEyeHeight(Pose,
  EntityDimensions) override — confirmed via @OverRide that this hook
  no longer exists in the 1.21 Entity API (getEyeHeight(Pose) is now
  final), so the override silently compiled but never ran
- CNEntityType: set eye height correctly via the 1.21 mechanism,
  EntityType.Builder.properties(p -> p.eyeHeight(0.68f)) (0.85 * 0.8,
  matching Forge's ratio), replacing the dead override removed above
- PARITE_FORGE_NEOFORGE.md: mark §3.4.5/IrradiatedWolf as resolved,
  document the getStandingEyeHeight API pitfall in detail (likely
  present, unfixed, in IrradiatedCat/IrradiatedCow — added as a new
  §5 priority item), update the top summary, §0 status table, §4
  pending-in-game-verification table, and §5 priority/resolved-notes
  sections accordingly
…iatedCat/IrradiatedCow and defer its fix out of scope

Follow-up to the IrradiatedWolf audit: confirmed by direct reading that
IrradiatedCat (line 339) and IrradiatedCow (line ~97) carry the same
dead getStandingEyeHeight override found and fixed on the wolf, but
deliberately leave it unfixed here — a broader integration pass is
planned on both entities to keep shrinking their divergence from the
vanilla mobs (continuing the work that already brought IrradiatedCat
from 380 to 40 divergent lines, §2.1), and a one-off fix now would be
wasted once that pass lands.

- §3.4.5: replace the "to verify/fix" note on IrradiatedCat/
  IrradiatedCow's getStandingEyeHeight with a resolved note confirming
  both files carry the dead override, explicitly scoping the real fix
  to the future vanilla-alignment refactor rather than this parity pass
- §5 priority list: drop the now-superseded "verify/fix
  getStandingEyeHeight on IrradiatedCat/IrradiatedCow" item and add a
  resolved-note block explaining why it's intentionally left out of
  the Forge/NeoForge parity tracking
…ormant armor/camera code paths

In-game testing pass (16 August) confirmed most previously "shipped
without in-game test" items from PARITE_FORGE_NEOFORGE.md's pending
table, but found and fixed a real ore-generation divergence, and
re-enabled two code paths that had been left commented out.

- CNConfiguredFeatures/CNPlacedFeatures: correct ore generation values
  that didn't match Forge — URANIUM_ORE count 7→4; LEAD_ORE vein size
  10→12 and max height 112→60; THORIUM_ORE vein size 16→12, count
  16→6, max height 112→55; STRIATED_ORES_OVERWORLD rarity 1/18→1/64
  and height range -30..70→-63..16 (NITRATE_ORE was already correct,
  untouched); regenerated worldgen JSONs reflect the new values
- AntiRadiationArmorItem: uncomment the DYE_ANTI_RADIATION_ARMOR
  advancement award call in inventoryTick, now that the advancement
  itself is re-enabled (CNAdvancement)
- ClientEvents: uncomment the CameraAccessor tremor-offset camera
  move call, restoring the physical camera shake effect
- CommentEvents: register a FluidBucketWrapper item capability for
  CNFluids.URANIUM's bucket via Capabilities.FluidHandler.ITEM
- CreateNuclearDatagen: provide default lang for the "irradiated"
  translation key group
- PARITE_FORGE_NEOFORGE.md: move the uranium/graphite tooltip,
  raw_uranium_block radiation, snow-powder fan, IrradiatedWolf taming
  message, ore mining drops, enable_world_gen (both states), and the
  full nitrogen chain out of the §4 pending-verification table as
  confirmed by manual in-game testing; document the ore-generation
  bug found and fixed above with a before/after table; note that
  WolfPanicGoal and the wolf's eyeHeight fix are deliberately deferred
  to a future pass covering all of the mod's living entities rather
  than tested in isolation; and record the open-pipe uranium
  irradiation test as inconclusive, with CNOpenPipeEffectHandlers/
  RadiationEffectHandler confirmed bit-identical to Forge and
  RadiationCapability.canBeIrradiated()'s enabledItemRadiation config
  flag flagged as an unexplored lead
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants