# Create/Mekanism Modular A [Truly Modular](https://modrinth.com/mod/modular-item-api) addon for Minecraft 1.21.1 / NeoForge. It adds 72 materials drawn from Create, Mekanism, Ice and Fire, Iron's Spells 'n Spellbooks, Create: The Air War, Create: Cosmonautics and Aeronautics: Interstellar Expansion, so those mods' metals, gems, scales and essences can be used to build modular tools and armour. Every source mod is optional. Install any subset - the materials for mods you do not have are never registered. ## How it is put together Almost all of this mod is data: MIAPI material JSON under `src/main/resources/packs//data/cmmodular/miapi/materials/`. The small amount of Java exists for two reasons. **Conditional loading.** MIAPI reads materials with its own loader, which does not honour `neoforge:conditions` or anything else that could switch a file off, and a material whose ingredient item is missing fails to parse. So each source mod's materials are a separate built-in datapack, registered in `CMModular.java` only when that mod is present. Titanium is the exception: Air War and Cosmonautics both add a titanium ingot, so one material covers both and draws its ingredients from `c:ingots/titanium` rather than an item id. Cosmonautics already declares that tag; the tag files in `data/c/` fill it in for Air War, which ships no common tags, using optional entries so a missing mod is not an error. **Fire immunity.** Cinder essence grants immunity to fire, which is not an attribute the game has and not a property MIAPI offers. Instead of coupling to MIAPI's internals, `FireImmunity.java` registers a `cmmodular:fire_immunity` attribute, the material grants it like any other attribute, and a damage handler watches for it. Neither side knows about the other. ## Stats Tinkers' Construct 3 is the reference, re-scaled onto MIAPI's vanilla-derived numbers (iron 235 durability, diamond 1546, netherite 2016). Materials with no Tinkers counterpart are built from what the material actually is, then fitted to the nearest tier band: | Tinkers | here | shape | | --- | --- | --- | | cobalt | titanium | light, fast, durable, unremarkable damage | | steel | steel | balanced workhorse, poor enchantability | | hepatizon | brass, bronze | copper alloys - quick and enchantable, not durable | | manyullyn | dragonsteel | top damage, endgame gate | | rose gold | refined glowstone, pixie dust | fragile, huge enchantability | | ancient hide | dragon scales, chitin | armour-first, high toughness | Tiers 6 and 7 sit above netherite: 6 is refined obsidian, shadow steel, refined radiance, atomic alloy and the two Iron's Spells essences; 7 is the three dragonsteels and antimatter. Real-material character does the rest of the work - lead is the heaviest thing here and swings slowest, osmium is dense and tough, HDPE weighs nothing and cannot cut rock, silver smites the undead. All of it lives in `tools/materials.py`, one entry per material with the reasoning in comments next to the numbers. ## Palettes Colours are not hand-picked. `tools/generate_materials.py` opens the source mods' jars, resolves each material's item model to its texture, and samples that texture to build MIAPI's seven-stop `grayscale_map`. The sampling deliberately does *not* normalise a stop's colour to its brightness number. A stop key is the brightness of MIAPI's grayscale template; its value is whatever the material looks like at that point in its own shading, which is why MIAPI's own netherite tops out at a murky `847a84` while iron runs to white. Samples are taken at percentiles of the texture's brightness order, so a texture with four shades still yields a full ramp and any hue drift between shadow and highlight survives. Pure-black outline pixels are excluded - they are not a shade of the material - and the darkest stop is extrapolated below the texture, which is what MIAPI's own palettes do. The sample points were tuned against MIAPI's hand-authored copper palette and reproduce it to within about 2% per channel. ## Building ```sh ./gradlew build ``` Needs nothing but NeoForge - Truly Modular is a runtime dependency only, since this mod talks to it purely through datapack JSON. ## Regenerating materials Only needed after editing `tools/materials.py` or when a source mod changes its textures. The generated JSON is committed, so a plain build does not need this. ```sh python3 tools/generate_materials.py --jars ~/path/to/mod/jars ``` The folder needs one jar per source mod. Every item id in `materials.py` is checked against those jars and the run fails on a typo, rather than shipping a material that silently refuses to load. Requires `pillow` and `numpy`. ## Notes - Titanium's palette comes from Cosmonautics' ingot, which is violet. Air War's is blue-white; swap `palette_from` on the titanium entry to prefer it. - Cinder essence is nearly black, because its texture is a charred ember. It is emissive, so it still reads as fire in game. - Dragon scales are one material per colour (12 dragon, 7 sea serpent, 3 death worm chitin). Colours within an element share stats and differ only in palette. - Interstellar Expansion is mostly machinery. Only three of its items are a material rather than a component; solid E-710 is left out because it is rocket fuel.