# Eden - cross-mod fluid & material unification

| path | what it is |
|---|---|
| `kubejs/server_scripts/eden_unify.js` | everything - config table plus all four passes, one file |
| `kubejs/data/**/tags/{fluid,item}/*.json` | the tags as a real datapack (authoritative) |
| `kubejs/eden_tools/generate_tags.mjs` | regenerates that datapack from the config table |

## Why one file

KubeJS 7 makes `global` an **unmodifiable map** in server scripts. The original
split (`eden_unify_00_config.js` through `_40_`) shared its config through
`global.EDEN`, which throws on assignment:

```
'global' cannot be assigned to in client or server scripts
```

Every dependent script then failed with `Cannot read property "FLUIDS" from
undefined`, so **nothing ran at all**. That is why Oritech, Logistics and
Stellaris crude oil were still rejected by the PneumaticCraft refinery while the
three fluids already in `c:crude_oil` worked.

Everything now lives in one closure with a local `const EDEN`, and each pass sits
in its own **nested IIFE** so their helpers cannot collide. No `global` anywhere.

### Two Rhino constraints worth knowing

KubeJS runs Rhino, not Node, and it is stricter in two ways that both bit this file:

1. **`global` is read-only** in client and server scripts
   (`GlobalUnmodifiableMap`). Only startup scripts may write it, and those do not
   re-run on `/reload`, so it is not a usable channel for config either.

2. **`const` inside a bare `{ }` block is not block-scoped.** Rhino hoists it and
   then reports `TypeError: redeclaration of var STYLE`. A first attempt at
   scoping the four passes with plain braces parsed fine under `node --check` and
   failed in-game. Wrap scopes in `(function () { ... })()` instead - Rhino
   handles function scope correctly, including `const` and `let` inside it.

If you add a pass, give it its own IIFE. Do not use a bare block.

## Why the tags are also a datapack

`ServerEvents.tags` runs as a KubeJS handler during tag loading. Anything that
snapshots tag contents earlier never sees those additions. Files under
`kubejs/data` are merged by vanilla's TagLoader alongside the mods' own tag
files, so they are always in place regardless of load order.

The datapack is the authoritative copy. **After editing `FLUIDS` or `ITEMS` in
`eden_unify.js`, rerun:**

```
node kubejs/eden_tools/generate_tags.mjs
```

Entries use `"required": false`, so a member whose mod is absent is skipped
rather than erroring.

## The four passes

**1. Tags** - 180 fluid entries across 41 tags, 62 item entries across 13 tags.

**2. Recipe rewriting** - 431 recipes that still named one fluid now read the
tag. Only input positions; outputs keep producing the mod's own fluid. Each mod
spells a tag ingredient differently, so the engine picks a syntax per namespace:

| syntax | JSON | mods |
|---|---|---|
| flat | `{tag: 'c:x', amount: n}` | MI, Extended Industrialization, PneumaticCraft, IE, Mekanism, Industrial Foregoing, EnderIO, Electrodynamics, Nuclear Science, Cyclic, Spectrum, Electro Energetics, Dynamic Electricity |
| hash | `{fluid: '#c:x', amount: n}` | Oritech |
| neoforge | `{type: 'neoforge:tag', tag: 'c:x', amount: n}` | Create, TFMG, Steam n Rails, Big Cannons, Create New Age |
| ca_stack | `{type: 'fluid_stack', fluid_tag: 'c:x', amount: n}` | Create: Crafts & Additions |
| nested | `{amount: n, ingredient: {tag: 'c:x'}}` | Theurgy, Advanced AE, Create Ore Excavation |
| nested_str | `{amount: n, ingredient: '#c:x'}` | Energized Power |

**3. Conversions** - 46 one-way 1:1 Create mixing recipes for the mods whose
codec reads a plain `FluidStack` and cannot match a tag: Logistics, Stellaris,
Actually Additions, Integrated Dynamics, Powah, AE2 Lootin', Applied Create,
Assembly Line, Blastcraft. Tag membership still works outbound, so their fluids
feed everyone else; these supply the way in.

**4. Item input fixes** - deliberately tiny. AlmostUnified already owns generic
item unification for `c:ingots/*`, `c:plates/*`, `c:raw_materials/*` and
`c:dusts/*`, so this only fixes hardcodes that are the sole entry point into a
chain another mod also builds. Currently one: Mekanism's Chemical Oxidizer.

## Output keys that are not outputs

Immersive Engineering uses `fluid` as the **input** on its mixer and bottling
machine, but as the **output** on its fermenter and squeezer (seeds to plant
oil). An earlier version of the rewriter treated all four the same and converted
54 IE outputs into tag ingredients, which would have broken them.
`TYPE_OUTPUT_KEYS` in the script now marks `fluid` as an output for those two
types specifically.

If you add a mod, check for the same trap: a key that reads like an input on one
recipe type and an output on another within the same namespace.

## Turning things off

- One substance: delete its entry from `FLUIDS` / `ITEMS`, then rerun the tag tool.
- One recipe type: add it to `SKIP_TYPES`.
- All conversions: set `CONVERSIONS = false` in pass 3.
- Verbose logging: set `DEBUG: true`.

If a rewrite does not stick for some recipe type (JEI still shows the original
fluid), set `MODE: 'replace'`. That removes the recipe and re-adds it under
`kubejs:eden_unify/...` instead of editing in place.

## Uranium hexafluoride: why the tag alone does nothing

Worth writing down, because it looks unified when it is not.

`c:uranium_hexafluoride` already held both mods before any of this work. But UF6
exists in **three different registries**, and a tag cannot span registries:

| registry | entry | who consumes it |
|---|---|---|
| `minecraft:fluid` | both mods' liquid UF6 | **nothing** - no recipe on either side reads it |
| `voltaic:gases` | Nuclear Science's UF6 gas | its Gas Centrifuge, hardcoded in Java with no recipe |
| `mekanism:chemical` | Mekanism's UF6 chemical | Mekanism's Chemical Centrifuge |

Nuclear Science's nuclear boiler outputs the **gas**; Mekanism's chemical infuser
outputs the **chemical**. Neither touches the fluid, so there is nothing to
bridge through.

**The two chains meet at yellowcake instead**, and that is now bidirectional:
Nuclear Science's nuclear boiler and MSR fuel preprocessor read
`c:yellow_cake_uranium`, and Mekanism's Chemical Oxidizer - which named its own
yellowcake outright and blocked the return trip - now reads the tag too.

Both upstream inputs were already shared: Mekanism's Enrichment Chamber reads
`c:ingots/uranium`, Nuclear Science's chemical extractor reads
`c:raw_materials/uranium`, and both chains take `c:hydrofluoric_acid` as a fluid,
which the Rotary Condensentrator can supply from Mekanism's HF chemical.

## Why editing `recipe.json` in place is safe here

Modern Industrialization ships its own KubeJS plugin with a real
`MachineRecipeSchema`, so its recipes load as `MachineKubeRecipe` with typed
component values rather than as raw JSON. A schema-backed recipe could in
principle re-serialize from its components and discard a raw JSON edit.

It does not. `KubeRecipe.save()` only sets `changed = true`.
`KubeRecipe.serialize()` walks the component value map and calls `writeToJson`
**only for holders whose `shouldWrite` flag is set**, and that flag is set only by
`setValue`. This script never calls `setValue`, so `serialize()` writes nothing
and the recipe is rebuilt from `json` - edits included. Assigning a plain JS
object to `recipe.json` also works: KubeJS registers a `DirectTypeWrapperFactory`
for `JsonObject` bound to `JsonUtils.objectOf`.

The rewrite pass is also run outside the game against all 79,142 recipe JSONs
extracted from the mod jars, using the exact script in this folder, with a proxy
that throws if anything touches `global`. Result: 431 recipes rewritten, 447
fluid input slots changed, 0 output subtrees touched, 0 errors.

## What was deliberately left alone

- **Powah's uraninite.** `powah:uraninite` and `powah:uraninite_raw` keep their own
  `c:ores/uraninite`, `c:raw_materials/uraninite` and `c:storage_blocks/uraninite`
  and are *not* merged into the uranium groups, so the Powah reactor chain stays a
  separate progression.
- **Mekanism chemicals** (gases, slurries, infusion types) are a separate registry
  from fluids and only Mekanism has them. The bridge already exists: the Rotary
  Condensentrator reads `c:` fluid tags.
- **Intermediate products that are not equivalent** - MI's `sulfuric_crude_oil`,
  `shale_oil`, `synthetic_oil`, the `steam_cracked_*` and `sulfuric_*` cuts, and
  Electrodynamics' crude/dirty/impure/royal mineral solutions. These are steps in
  one mod's own chain, not a shared substance.
- **Output normalisation.** Every machine now accepts every variant, so you can
  keep six crude oils in six tanks and it all still works.

## Fluid groups

| group | canonical tag | alias tags | members |
|---|---|---|---|
| `crude_oil` | `c:crude_oil` | `c:oil` | `modern_industrialization:crude_oil`, `pneumaticcraft:oil`, `tfmg:crude_oil`, `oritech:still_oil`, `logistics:core/crude_oil`, `stellaris:oil` |
| `heavy_oil` | `c:heavy_oil` | - | `tfmg:heavy_oil`, `oritech:still_heavy_oil`, `modern_industrialization:heavy_fuel` |
| `naphtha` | `c:naphtha` | - | `modern_industrialization:naphtha`, `oritech:still_naphtha`, `tfmg:naphtha` |
| `diesel` | `c:diesel` | - | `modern_industrialization:diesel`, `oritech:still_diesel`, `pneumaticcraft:diesel`, `tfmg:diesel`, `stellaris:diesel`, `logistics:core/fuel_oil` |
| `gasoline` | `c:gasoline` | - | `pneumaticcraft:gasoline`, `tfmg:gasoline` |
| `kerosene` | `c:kerosene` | - | `pneumaticcraft:kerosene`, `tfmg:kerosene` |
| `lpg` | `c:lpg` | - | `pneumaticcraft:lpg`, `tfmg:lpg` |
| `lubricant` | `c:lubricant` | `c:lubrication_oil` | `dynamicelectricity:fluidlubricant`, `modern_industrialization:lubricant`, `pneumaticcraft:lubricant`, `tfmg:lubrication_oil` |
| `creosote` | `c:creosote` | - | `immersiveengineering:creosote`, `modern_industrialization:creosote`, `tfmg:creosote` |
| `plant_oil` | `c:plantoil` | `c:plant_oil` | `createaddition:seed_oil`, `electroenergetics:plant_oil`, `immersiveengineering:plantoil`, `pneumaticcraft:vegetable_oil`, `modern_industrialization:plant_oil`, `logistics:core/seed_oil`, `actuallyadditions:canola_oil` |
| `ethanol` | `c:ethanol` | - | `electrodynamics:fluidethanol`, `immersiveengineering:ethanol`, `modern_industrialization:ethanol`, `pneumaticcraft:ethanol` |
| `biodiesel` | `c:biodiesel` | - | `immersiveengineering:biodiesel`, `modern_industrialization:biodiesel`, `oritech:still_biofuel`, `pneumaticcraft:biodiesel` |
| `biofuel` | `c:biofuel` | `c:bioethanol` | `createaddition:bioethanol`, `industrialforegoing:biofuel`, `oritech:still_biofuel`, `logistics:core/bio_fuel`, `mekanismgenerators:bioethanol` |
| `turbofuel` | `c:turbofuel` | `c:high_power_biodiesel` | `immersiveengineering:high_power_biodiesel`, `oritech:still_fuel`, `stellaris:fuel` |
| `hydrogen` | `c:hydrogen` | - | `electrodynamics:fluidhydrogen`, `mekanism:hydrogen`, `modern_industrialization:hydrogen`, `stellaris:hydrogen`, `tfmg:hydrogen` |
| `oxygen` | `c:oxygen` | - | `electrodynamics:fluidoxygen`, `mekanism:oxygen`, `modern_industrialization:oxygen`, `stellaris:oxygen` |
| `ethylene` | `c:ethylene` | `c:ethene` | `modern_industrialization:ethylene`, `mekanism:ethene`, `tfmg:ethylene` |
| `propene` | `c:propene` | - | `modern_industrialization:propene`, `tfmg:propylene` |
| `sulfuric_acid` | `c:sulfuric_acid` | - | `electrodynamics:fluidsulfuricacid`, `mekanism:sulfuric_acid`, `modern_industrialization:sulfuric_acid`, `oritech:still_sulfuric_acid`, `tfmg:sulfuric_acid` |
| `hydrochloric_acid` | `c:hydrochloric_acid` | - | `electrodynamics:fluidhydrochloricacid`, `modern_industrialization:hydrochloric_acid` |
| `chlorine` | `c:chlorine` | - | `mekanism:chlorine`, `modern_industrialization:chlorine` |
| `steam` | `c:steam` | - | `mekanism:steam`, `modern_industrialization:steam`, `oritech:still_steam` |
| `molten_plastic` | `c:molten_plastic` | `c:polyethylene` | `modern_industrialization:polyethylene`, `electrodynamics:fluidpolyethylene`, `tfmg:molten_plastic`, `pneumaticcraft:plastic` |
| `uranium_hexafluoride` | `c:uranium_hexafluoride` | - | `mekanism:uranium_hexafluoride`, `nuclearscience:uraniumhexafluoride` |
| `heavy_water` | `c:heavy_water` | - | `mekanism:heavy_water`, `modern_industrialization:heavy_water` |
| `deuterium` | `c:deuterium` | - | `mekanismgenerators:deuterium`, `modern_industrialization:deuterium` |
| `tritium` | `c:tritium` | - | `mekanismgenerators:tritium`, `modern_industrialization:tritium` |
| `concrete` | `c:concrete` | - | `blastcraft:fluidconcrete`, `immersiveengineering:concrete`, `tfmg:liquid_concrete` |
| `molten_steel` | `c:molten_steel` | - | `createbigcannons:molten_steel`, `tfmg:molten_steel` |
| `liquid_redstone` | `c:redstone` | `c:molten_redstone` | `cyclic:redstone`, `modern_industrialization:molten_redstone`, `logistics:core/liquid_redstone` |
| `liquid_ender` | `c:ender` | - | `cyclic:ender`, `logistics:core/liquid_ender` |
| `liquid_glowstone` | `c:glowstone` | - | `cyclic:glowstone`, `logistics:core/liquid_glowstone` |
| `biomass` | `c:biomass` | - | `cyclic:biomass`, `logistics:core/liquid_biomass` |

## Item groups

| group | canonical tag | alias tags | members |
|---|---|---|---|
| `plastic_sheet` | `c:plastics` | `c:plastic`, `c:plates/plastic`, `c:ingots/plastic` | `mekanism:hdpe_sheet`, `electrodynamics:sheetplastic`, `immersiveengineering:plate_duroplast`, `industrialforegoing:plastic`, `oritech:plastic_sheet`, `pneumaticcraft:plastic`, `tfmg:plastic_sheet` |
| `rubber_sheet` | `c:ingots/rubber` | `c:plates/rubber` | `modern_industrialization:rubber_sheet`, `tfmg:rubber_sheet` |
| `silicon` | `c:silicon` | `c:ingots/silicon` | `ae2:silicon`, `enderio:silicon`, `energizedpower:silicon`, `oritech:silicon`, `modern_industrialization:silicon_ingot`, `tfmg:silicon_ingot` |
| `yellowcake` | `c:yellow_cake_uranium` | `c:dusts/yellowcake` | `mekanism:yellow_cake_uranium`, `nuclearscience:yellowcake` |
| `uranium_ingot` | `c:ingots/uranium` | - | `immersiveengineering:ingot_uranium`, `mekanism:ingot_uranium`, `modern_industrialization:uranium_ingot`, `stellaris:uranium_ingot` |
| `raw_uranium` | `c:raw_materials/uranium` | - | `electrodynamics:raworeuranium`, `immersiveengineering:raw_uranium`, `mekanism:raw_uranium`, `modern_industrialization:raw_uranium`, `oritech:raw_uranium`, `stellaris:raw_uranium`, `alexscaves:uranium` |
| `plutonium_pellet` | `c:pellets/plutonium` | - | `mekanism:pellet_plutonium`, `nuclearscience:plutonium239`, `oritech:plutonium_pellet` |

## What the tags actually gain

Tags that already existed and what this adds to them. `(new tag)` means nothing shipped it.

**`c:crude_oil`** (fluid)  
  had: `modern_industrialization:crude_oil`, `pneumaticcraft:oil`, `tfmg:crude_oil`, `tfmg:flowing_crude_oil`  
  gains: `oritech:still_oil`, `logistics:core/crude_oil`, `stellaris:oil`

**`c:oil`** (fluid)  
  had: `oritech:still_oil`  
  gains: `modern_industrialization:crude_oil`, `pneumaticcraft:oil`, `tfmg:crude_oil`, `tfmg:flowing_crude_oil`, `logistics:core/crude_oil`, `stellaris:oil`

**`c:heavy_oil`** (fluid)  
  had: `tfmg:flowing_heavy_oil`, `tfmg:heavy_oil`  
  gains: `oritech:still_heavy_oil`, `modern_industrialization:heavy_fuel`

**`c:diesel`** (fluid)  
  had: `modern_industrialization:diesel`, `oritech:still_diesel`, `pneumaticcraft:diesel`, `tfmg:diesel`, `tfmg:flowing_diesel`  
  gains: `stellaris:diesel`, `logistics:core/fuel_oil`

**`c:lubricant`** (fluid)  
  had: `dynamicelectricity:fluidlubricant`, `modern_industrialization:lubricant`, `pneumaticcraft:lubricant`  
  gains: `tfmg:lubrication_oil`, `tfmg:flowing_lubrication_oil`

**`c:lubrication_oil`** (fluid)  
  had: `tfmg:flowing_lubrication_oil`, `tfmg:lubrication_oil`  
  gains: `dynamicelectricity:fluidlubricant`, `modern_industrialization:lubricant`, `pneumaticcraft:lubricant`

**`c:plantoil`** (fluid)  
  had: `createaddition:flowing_seed_oil`, `createaddition:seed_oil`, `electroenergetics:flowing_plant_oil`, `electroenergetics:plant_oil`, `immersiveengineering:plantoil`, `pneumaticcraft:vegetable_oil`  
  gains: `modern_industrialization:plant_oil`, `logistics:core/seed_oil`, `actuallyadditions:canola_oil`

**`c:plant_oil`** (fluid)  
  had: `modern_industrialization:plant_oil`  
  gains: `createaddition:seed_oil`, `createaddition:flowing_seed_oil`, `electroenergetics:plant_oil`, `electroenergetics:flowing_plant_oil`, `immersiveengineering:plantoil`, `pneumaticcraft:vegetable_oil`, `logistics:core/seed_oil`, `actuallyadditions:canola_oil`

**`c:biofuel`** (fluid)  
  had: `createaddition:bioethanol`, `createaddition:flowing_bioethanol`, `industrialforegoing:biofuel`, `oritech:still_biofuel`  
  gains: `logistics:core/bio_fuel`, `mekanismgenerators:bioethanol`, `mekanismgenerators:flowing_bioethanol`

**`c:bioethanol`** (fluid)  
  had: `mekanismgenerators:bioethanol`, `mekanismgenerators:flowing_bioethanol`  
  gains: `createaddition:bioethanol`, `createaddition:flowing_bioethanol`, `industrialforegoing:biofuel`, `oritech:still_biofuel`, `logistics:core/bio_fuel`

**`c:turbofuel`** (fluid)  
  had: `oritech:still_fuel`  
  gains: `immersiveengineering:high_power_biodiesel`, `stellaris:fuel`

**`c:high_power_biodiesel`** (fluid)  
  had: `immersiveengineering:high_power_biodiesel`, `oritech:still_fuel`  
  gains: `stellaris:fuel`

**`c:hydrogen`** (fluid)  
  had: `electrodynamics:fluidhydrogen`, `mekanism:flowing_hydrogen`, `mekanism:hydrogen`, `modern_industrialization:hydrogen`, `stellaris:flowing_hydrogen`, `stellaris:hydrogen`  
  gains: `tfmg:hydrogen`, `tfmg:flowing_hydrogen`

**`c:ethylene`** (fluid)  
  had: `modern_industrialization:ethylene`  
  gains: `mekanism:ethene`, `mekanism:flowing_ethene`, `tfmg:ethylene`, `tfmg:flowing_ethylene`

**`c:ethene`** (fluid)  
  had: `mekanism:ethene`, `mekanism:flowing_ethene`  
  gains: `modern_industrialization:ethylene`, `tfmg:ethylene`, `tfmg:flowing_ethylene`

**`c:propene`** (fluid)  
  had: `modern_industrialization:propene`  
  gains: `tfmg:propylene`

**`c:sulfuric_acid`** (fluid)  
  had: `electrodynamics:fluidsulfuricacid`, `mekanism:flowing_sulfuric_acid`, `mekanism:sulfuric_acid`, `modern_industrialization:sulfuric_acid`, `oritech:still_sulfuric_acid`  
  gains: `tfmg:sulfuric_acid`

**`c:molten_plastic`** (fluid)  
  had: _(new tag)_  
  gains: `modern_industrialization:polyethylene`, `electrodynamics:fluidpolyethylene`, `tfmg:molten_plastic`, `pneumaticcraft:plastic`

**`c:polyethylene`** (fluid)  
  had: `electrodynamics:fluidpolyethylene`, `modern_industrialization:polyethylene`  
  gains: `tfmg:molten_plastic`, `pneumaticcraft:plastic`

**`c:concrete`** (fluid)  
  had: `blastcraft:fluidconcrete`, `immersiveengineering:concrete`  
  gains: `tfmg:liquid_concrete`

**`c:redstone`** (fluid)  
  had: `cyclic:redstone`, `thermal:redstone`  
  gains: `modern_industrialization:molten_redstone`, `logistics:core/liquid_redstone`

**`c:molten_redstone`** (fluid)  
  had: `modern_industrialization:molten_redstone`  
  gains: `cyclic:redstone`, `logistics:core/liquid_redstone`

**`c:ender`** (fluid)  
  had: `cyclic:ender`, `thermal:ender`  
  gains: `logistics:core/liquid_ender`

**`c:glowstone`** (fluid)  
  had: `cyclic:glowstone`, `thermal:glowstone`  
  gains: `logistics:core/liquid_glowstone`

**`c:biomass`** (fluid)  
  had: `cyclic:biomass`  
  gains: `cyclic:biomass_flowing`, `logistics:core/liquid_biomass`

**`c:plastics`** (item)  
  had: `industrialforegoing:plastic`, `oritech:plastic_sheet`  
  gains: `mekanism:hdpe_sheet`, `electrodynamics:sheetplastic`, `immersiveengineering:plate_duroplast`, `pneumaticcraft:plastic`, `tfmg:plastic_sheet`

**`c:plastic`** (item)  
  had: `electrodynamics:sheetplastic`  
  gains: `mekanism:hdpe_sheet`, `immersiveengineering:plate_duroplast`, `industrialforegoing:plastic`, `oritech:plastic_sheet`, `pneumaticcraft:plastic`, `tfmg:plastic_sheet`

**`c:plates/plastic`** (item)  
  had: `immersiveengineering:plate_duroplast`, `oritech:plastic_sheet`  
  gains: `mekanism:hdpe_sheet`, `electrodynamics:sheetplastic`, `industrialforegoing:plastic`, `pneumaticcraft:plastic`, `tfmg:plastic_sheet`

**`c:ingots/plastic`** (item)  
  had: `tfmg:plastic_sheet`  
  gains: `mekanism:hdpe_sheet`, `electrodynamics:sheetplastic`, `immersiveengineering:plate_duroplast`, `industrialforegoing:plastic`, `oritech:plastic_sheet`, `pneumaticcraft:plastic`

**`c:ingots/rubber`** (item)  
  had: `tfmg:rubber_sheet`  
  gains: `modern_industrialization:rubber_sheet`

**`c:plates/rubber`** (item)  
  had: _(new tag)_  
  gains: `modern_industrialization:rubber_sheet`, `tfmg:rubber_sheet`

**`c:silicon`** (item)  
  had: `ae2:silicon`, `enderio:silicon`, `energizedpower:silicon`, `oritech:silicon`  
  gains: `modern_industrialization:silicon_ingot`, `tfmg:silicon_ingot`

**`c:ingots/silicon`** (item)  
  had: `modern_industrialization:silicon_ingot`, `tfmg:silicon_ingot`  
  gains: `ae2:silicon`, `enderio:silicon`, `energizedpower:silicon`, `oritech:silicon`

**`c:yellow_cake_uranium`** (item)  
  had: `nuclearscience:yellowcake`  
  gains: `mekanism:yellow_cake_uranium`

**`c:dusts/yellowcake`** (item)  
  had: _(new tag)_  
  gains: `mekanism:yellow_cake_uranium`, `nuclearscience:yellowcake`

**`c:raw_materials/uranium`** (item)  
  had: `electrodynamics:raworeuranium`, `immersiveengineering:raw_uranium`, `mekanism:raw_uranium`, `modern_industrialization:raw_uranium`, `oritech:raw_uranium`, `stellaris:raw_uranium`  
  gains: `alexscaves:uranium`

**`c:pellets/plutonium`** (item)  
  had: `mekanism:pellet_plutonium`, `nuclearscience:plutonium239`  
  gains: `oritech:plutonium_pellet`
