Add Truly Modular materials for Create, Mekanism, Ice and Fire and friends

72 materials sourced from Create, Mekanism, Ice and Fire, Iron's Spells,
Create: The Air War, Create: Cosmonautics and Aeronautics: Interstellar
Expansion.

Stats follow Tinkers' Construct 3 re-scaled onto MIAPI's vanilla-derived
numbers; materials with no Tinkers counterpart are built from what the
material actually is and then fitted to the nearest tier band.

Palettes are not hand-picked. tools/generate_materials.py reads each
material's texture out of the source mod's jar and samples it into MIAPI's
seven-stop grayscale_map, reproducing MIAPI's own hand-authored copper
palette to within ~2% per channel.

MIAPI's material loader honours no datapack conditions, and a material whose
ingredient item is missing fails to parse, so each mod's materials ship as a
built-in datapack registered only when that mod is installed. Titanium is
shared by both aerospace addons and so sources its ingredients from
c:ingots/titanium instead of an item id.

Cinder essence grants fire immunity through an attribute this mod registers
and watches itself, rather than coupling to MIAPI internals.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
modules-and-missing-materials
Amir Alexander Abdelbaki 2026-08-12 18:40:07 +02:00
commit c55caa1d1e
99 changed files with 5946 additions and 0 deletions

7
.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
build/
.gradle/
run/
runs/
repo/
*.class
__pycache__/

117
README.md Normal file
View File

@ -0,0 +1,117 @@
# 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/<mod>/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.

59
build.gradle Normal file
View File

@ -0,0 +1,59 @@
plugins {
id 'java'
id 'net.neoforged.moddev' version '2.0.143'
}
version = project.mod_version
group = project.mod_group_id
base.archivesName = project.mod_id
java.toolchain.languageVersion = JavaLanguageVersion.of(21)
neoForge {
version = project.neo_version
runs {
client {
client()
}
server {
server()
}
}
mods {
"${project.mod_id}" {
sourceSet sourceSets.main
}
}
}
repositories {
mavenCentral()
}
// Nothing to compile against beyond NeoForge itself. Truly Modular is a runtime
// dependency only: this mod talks to it purely through datapack JSON, so there
// is no API to build on and no version to get wrong at compile time.
dependencies {
}
tasks.withType(ProcessResources).configureEach {
var replacements = [
mod_id : project.mod_id,
mod_name : project.mod_name,
mod_version : project.mod_version,
mod_authors : project.mod_authors,
mod_description: project.mod_description,
]
inputs.properties replacements
filesMatching('META-INF/neoforge.mods.toml') {
expand replacements
}
}
tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8'
options.release = 21
}

13
gradle.properties Normal file
View File

@ -0,0 +1,13 @@
org.gradle.jvmargs=-Xmx3G
org.gradle.parallel=true
org.gradle.caching=true
minecraft_version=1.21.1
neo_version=21.1.248
mod_id=cmmodular
mod_name=Create/Mekanism Modular
mod_version=1.0.0
mod_group_id=eu.abdelbaki.cmmodular
mod_authors=themiro
mod_description=Materials from Create, Mekanism, Ice and Fire, Iron's Spells and the Create aerospace addons, for Truly Modular.

BIN
gradle/wrapper/gradle-wrapper.jar vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

251
gradlew vendored Executable file
View File

@ -0,0 +1,251 @@
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
#
##############################################################################
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
warn () {
echo "$*"
} >&2
die () {
echo
echo "$*"
echo
exit 1
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

94
gradlew.bat vendored Normal file
View File

@ -0,0 +1,94 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

13
settings.gradle Normal file
View File

@ -0,0 +1,13 @@
pluginManagement {
repositories {
mavenCentral()
gradlePluginPortal()
maven { url = 'https://maven.neoforged.net/releases' }
}
}
plugins {
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0'
}
rootProject.name = 'create-mekanism-modular'

View File

@ -0,0 +1,87 @@
package eu.abdelbaki.cmmodular;
import java.util.List;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.PackType;
import net.minecraft.server.packs.repository.Pack;
import net.minecraft.server.packs.repository.PackSource;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.ModList;
import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.event.AddPackFindersEvent;
/**
* Adds the materials of Create, Mekanism, Ice and Fire, Iron's Spells and the
* Create aerospace addons to Truly Modular.
*
* <p>Almost all of this mod is data. The one thing data cannot do is load
* conditionally: MIAPI reads materials with its own loader, which honours
* neither {@code neoforge:conditions} nor anything else that could switch a
* file off, and a material whose ingredient item does not exist fails to parse
* outright. So each source mod's materials live in their own built-in datapack
* and only get registered when that mod is actually installed.
*/
@Mod(CMModular.MOD_ID)
public class CMModular {
public static final String MOD_ID = "cmmodular";
/**
* A set of materials, and the mods it needs in order to load.
*
* @param anyOf when true one of {@code requires} is enough, rather than all
* of them. Such a pack cannot name items directly - it has no
* way to know which mod turned up - so it sources ingredients
* from item tags instead.
*/
private record MaterialPack(String id, String name, List<String> requires, boolean anyOf) {
MaterialPack(String id, String name, String... requires) {
this(id, name, List.of(requires), false);
}
boolean present() {
return anyOf
? requires.stream().anyMatch(ModList.get()::isLoaded)
: requires.stream().allMatch(ModList.get()::isLoaded);
}
}
private static final List<MaterialPack> PACKS = List.of(
new MaterialPack("mekanism", "Mekanism Materials", "mekanism"),
new MaterialPack("create", "Create Materials", "create"),
new MaterialPack("iceandfire", "Ice and Fire Materials", "iceandfire"),
new MaterialPack("irons_spellbooks", "Iron's Spells Materials", "irons_spellbooks"),
new MaterialPack("interstellar", "Interstellar Expansion Materials", "vsie"),
new MaterialPack("air_war", "Create: The Air War Materials", "create_the_air_wars"),
new MaterialPack("cosmonautics", "Create: Cosmonautics Materials", "rocketnautics"),
// Both aerospace addons add a titanium ingot. One material covers
// them both, fed by the c:ingots/titanium tag.
new MaterialPack("aerospace", "Aerospace Materials",
List.of("create_the_air_wars", "rocketnautics"), true));
public CMModular(IEventBus modBus) {
FireImmunity.register(modBus);
modBus.addListener(this::addMaterialPacks);
}
private void addMaterialPacks(AddPackFindersEvent event) {
if (event.getPackType() != PackType.SERVER_DATA) {
return;
}
for (MaterialPack pack : PACKS) {
if (!pack.present()) {
continue;
}
event.addPackFinders(
ResourceLocation.fromNamespaceAndPath(MOD_ID, "packs/" + pack.id()),
PackType.SERVER_DATA,
Component.literal(pack.name()),
PackSource.BUILT_IN,
// Always on and above the base pack, so a material extension
// lands on top of the material it extends.
true,
Pack.Position.TOP);
}
}
}

View File

@ -0,0 +1,58 @@
package eu.abdelbaki.cmmodular;
import net.minecraft.core.registries.Registries;
import net.minecraft.tags.DamageTypeTags;
import net.minecraft.world.entity.ai.attributes.Attribute;
import net.minecraft.world.entity.ai.attributes.AttributeInstance;
import net.minecraft.world.entity.ai.attributes.RangedAttribute;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.event.entity.EntityAttributeModificationEvent;
import net.neoforged.neoforge.event.entity.living.LivingIncomingDamageEvent;
import net.neoforged.neoforge.registries.DeferredHolder;
import net.neoforged.neoforge.registries.DeferredRegister;
/**
* Cinder essence grants immunity to fire, which nothing in the game models as
* an attribute and MIAPI has no property for.
*
* <p>Rather than couple this mod to MIAPI's internals, the material JSON grants
* an attribute registered here and this class watches for it. MIAPI only has to
* do what it already does for any attribute, and the two sides never touch.
*/
public final class FireImmunity {
private static final DeferredRegister<Attribute> ATTRIBUTES =
DeferredRegister.create(Registries.ATTRIBUTE, CMModular.MOD_ID);
/** At or above 1 the wearer does not take fire damage; 0 is no protection. */
public static final DeferredHolder<Attribute, Attribute> FIRE_IMMUNITY =
ATTRIBUTES.register("fire_immunity", id -> new RangedAttribute(
"attribute.cmmodular.fire_immunity", 0.0D, 0.0D, 1.0D).setSyncable(true));
private FireImmunity() {
}
static void register(IEventBus modBus) {
ATTRIBUTES.register(modBus);
modBus.addListener(FireImmunity::attachToEntities);
NeoForge.EVENT_BUS.addListener(FireImmunity::onIncomingDamage);
}
/** Attributes only exist on an entity if they were added to its type. */
private static void attachToEntities(EntityAttributeModificationEvent event) {
event.getTypes().forEach(type -> event.add(type, FIRE_IMMUNITY));
}
private static void onIncomingDamage(LivingIncomingDamageEvent event) {
if (!event.getSource().is(DamageTypeTags.IS_FIRE)) {
return;
}
AttributeInstance instance = event.getEntity().getAttribute(FIRE_IMMUNITY);
if (instance != null && instance.getValue() >= 1.0D) {
// Put the wearer out as well, otherwise they burn harmlessly but
// permanently, which reads as a bug.
event.getEntity().clearFire();
event.setCanceled(true);
}
}
}

View File

@ -0,0 +1,93 @@
modLoader = "javafml"
loaderVersion = "[4,)"
license = "MIT"
issueTrackerURL = "https://github.com/themiro/create-mekanism-modular/issues"
[[mods]]
modId = "${mod_id}"
version = "${mod_version}"
displayName = "${mod_name}"
authors = "${mod_authors}"
description = '''${mod_description}'''
# Every range here is open on purpose. Mods in this space version themselves as
# "1.21.1-3.16.2", which Maven ordering reads as 1.21.1 with a qualifier - so a
# range like [3.16,) rejects a perfectly good build, and for an optional
# dependency that is installed but out of range FML hard-fails the launch.
# Nothing here needs a version floor anyway: the material packs are gated at
# runtime on whether the mod is loaded, not on what version it is.
# Truly Modular is what this mod adds materials to; without it there is nothing
# to add them to.
[[dependencies.${mod_id}]]
modId = "miapi"
type = "required"
versionRange = "[0,)"
ordering = "AFTER"
side = "BOTH"
[[dependencies.${mod_id}]]
modId = "neoforge"
type = "required"
versionRange = "[21.1,)"
ordering = "NONE"
side = "BOTH"
[[dependencies.${mod_id}]]
modId = "minecraft"
type = "required"
versionRange = "[1.21.1,1.22)"
ordering = "NONE"
side = "BOTH"
# Every source mod is optional. Each one's materials live in a datapack that is
# only registered when that mod is present, so any subset works - including none
# of them, which simply adds nothing.
[[dependencies.${mod_id}]]
modId = "mekanism"
type = "optional"
versionRange = "[0,)"
ordering = "AFTER"
side = "BOTH"
[[dependencies.${mod_id}]]
modId = "create"
type = "optional"
versionRange = "[0,)"
ordering = "AFTER"
side = "BOTH"
[[dependencies.${mod_id}]]
modId = "iceandfire"
type = "optional"
versionRange = "[0,)"
ordering = "AFTER"
side = "BOTH"
[[dependencies.${mod_id}]]
modId = "irons_spellbooks"
type = "optional"
versionRange = "[0,)"
ordering = "AFTER"
side = "BOTH"
[[dependencies.${mod_id}]]
modId = "vsie"
type = "optional"
versionRange = "[0,)"
ordering = "AFTER"
side = "BOTH"
[[dependencies.${mod_id}]]
modId = "create_the_air_wars"
type = "optional"
versionRange = "[0,)"
ordering = "AFTER"
side = "BOTH"
[[dependencies.${mod_id}]]
modId = "rocketnautics"
type = "optional"
versionRange = "[0,)"
ordering = "AFTER"
side = "BOTH"

View File

@ -0,0 +1,3 @@
{
"attribute.cmmodular.fire_immunity": "Fire Immunity"
}

View File

@ -0,0 +1,9 @@
{
"replace": false,
"values": [
{
"id": "create_the_air_wars:titaniumingot",
"required": false
}
]
}

View File

@ -0,0 +1,9 @@
{
"replace": false,
"values": [
{
"id": "create_the_air_wars:titaniumnugget",
"required": false
}
]
}

View File

@ -0,0 +1,9 @@
{
"replace": false,
"values": [
{
"id": "create_the_air_wars:titaniumsheet",
"required": false
}
]
}

View File

@ -0,0 +1,6 @@
{
"pack": {
"description": "Create/Mekanism Modular materials",
"pack_format": 48
}
}

View File

@ -0,0 +1,67 @@
{
"translation": "Titanium ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "rocketnautics:titanium_ingot"
},
"hardness": 5.8,
"density": 1.6,
"flexibility": 3,
"durability": 1150,
"enchantability": 11,
"toughness": 2,
"tier": 4,
"mining_speed": 9,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 32,
"armor_toughness": 1.5,
"color": "CEA6D3",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "0e0812",
"68": "1b0f22",
"107": "342039",
"150": "552d61",
"190": "bb86bc",
"216": "cea6d3",
"255": "f3d4f2"
},
"filler": "interpolate"
},
"textures": [
"metallic"
],
"properties": {
"default": {
"fire_proof": true
},
"handheld": {
"attributes": [
{
"attribute": "generic.attack_speed",
"value": "0.06",
"operation": "+",
"slot": "mainhand"
}
]
}
},
"items": [
{
"tag": "c:ingots/titanium",
"value": 1.0
},
{
"tag": "c:nuggets/titanium",
"value": 0.11112
},
{
"tag": "c:plates/titanium",
"value": 1.0
}
]
}

View File

@ -0,0 +1,6 @@
{
"pack": {
"description": "Aerospace Materials for Truly Modular",
"pack_format": 48
}
}

View File

@ -0,0 +1,53 @@
{
"translation": "Sulfur ",
"groups": [
"crystal"
],
"icon": {
"type": "item",
"item": "create_the_air_wars:raw_sulfur"
},
"hardness": 3.0,
"density": 2.0,
"flexibility": 1,
"durability": 140,
"enchantability": 14,
"toughness": 0,
"tier": 2,
"mining_speed": 4,
"mining_level": "minecraft:incorrect_for_stone_tool",
"armor_durability": 6,
"color": "FAFDE0",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "724e0a",
"68": "dc9613",
"107": "dc9613",
"150": "e9b115",
"190": "e0f55f",
"216": "fafde0",
"255": "fafde0"
},
"filler": "interpolate"
},
"textures": [
"crystal",
"rough"
],
"properties": {
"default": {
"immolate": "2"
}
},
"items": [
{
"item": "create_the_air_wars:raw_sulfur",
"value": 1.0
},
{
"item": "create_the_air_wars:crashedsulfur",
"value": 1.0
}
]
}

View File

@ -0,0 +1,61 @@
{
"translation": "Amalgam ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "create_the_air_wars:rough_amalgam"
},
"hardness": 4.4,
"density": 5.5,
"flexibility": 3,
"durability": 320,
"enchantability": 21,
"toughness": 0,
"tier": 3,
"mining_speed": 7,
"mining_level": "minecraft:incorrect_for_iron_tool",
"armor_durability": 15,
"color": "D7A668",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "3d201d",
"68": "753d37",
"107": "864f48",
"150": "996247",
"190": "c88666",
"216": "d7a668",
"255": "fcf3e4"
},
"filler": "interpolate"
},
"textures": [
"metallic",
"shiny"
],
"properties": {
"handheld": {
"leeching": "0.3",
"attributes": [
{
"attribute": "generic.attack_speed",
"value": "-0.08",
"operation": "+",
"slot": "mainhand"
}
]
}
},
"items": [
{
"item": "create_the_air_wars:rough_amalgam",
"value": 1.0
},
{
"item": "create_the_air_wars:crushed_amalgam",
"value": 1.0
}
]
}

View File

@ -0,0 +1,6 @@
{
"pack": {
"description": "Create: The Air War Materials for Truly Modular",
"pack_format": 48
}
}

View File

@ -0,0 +1,61 @@
{
"translation": "Titanium Alloy ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "rocketnautics:titanium_alloy"
},
"hardness": 6.8,
"density": 2.2,
"flexibility": 3,
"durability": 1900,
"enchantability": 12,
"toughness": 3,
"tier": 5,
"mining_speed": 10,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 36,
"armor_toughness": 2.0,
"color": "F283B4",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "280c23",
"68": "4d1844",
"107": "641f56",
"150": "81206c",
"190": "e25897",
"216": "f283b4",
"255": "fbaccb"
},
"filler": "interpolate"
},
"textures": [
"metallic"
],
"properties": {
"default": {
"fire_proof": true
}
},
"items": [
{
"item": "rocketnautics:titanium_alloy",
"value": 1.0
},
{
"item": "rocketnautics:titanium_alloy_nugget",
"value": 0.11112
},
{
"item": "rocketnautics:titanium_alloy_sheet",
"value": 1.0
},
{
"item": "rocketnautics:titanium_alloy_block",
"value": 9.0
}
]
}

View File

@ -0,0 +1,6 @@
{
"pack": {
"description": "Create: Cosmonautics Materials for Truly Modular",
"pack_format": 48
}
}

View File

@ -0,0 +1,49 @@
{
"translation": "Andesite Alloy ",
"groups": [
"metal",
"stone"
],
"icon": {
"type": "item",
"item": "create:andesite_alloy"
},
"hardness": 4.4,
"density": 4.2,
"flexibility": 1,
"durability": 210,
"enchantability": 8,
"toughness": 1,
"tier": 2,
"mining_speed": 4,
"mining_level": "minecraft:incorrect_for_stone_tool",
"armor_durability": 12,
"color": "C9CABA",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "161c1c",
"68": "2b3635",
"107": "4a5451",
"150": "5e6963",
"190": "829789",
"216": "c9caba",
"255": "c9caba"
},
"filler": "interpolate"
},
"textures": [
"rough",
"metallic"
],
"items": [
{
"item": "create:andesite_alloy",
"value": 1.0
},
{
"item": "create:andesite_alloy_block",
"value": 9.0
}
]
}

View File

@ -0,0 +1,56 @@
{
"translation": "Brass ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "create:brass_ingot"
},
"hardness": 5.0,
"density": 3.4,
"flexibility": 2,
"durability": 380,
"enchantability": 18,
"toughness": 1,
"tier": 3,
"mining_speed": 8,
"mining_level": "minecraft:incorrect_for_iron_tool",
"armor_durability": 18,
"color": "FFEB94",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "321813",
"68": "602f24",
"107": "76462d",
"150": "995a3d",
"190": "fbcc68",
"216": "ffeb94",
"255": "fff9c7"
},
"filler": "interpolate"
},
"textures": [
"metallic",
"bright"
],
"items": [
{
"item": "create:brass_ingot",
"value": 1.0
},
{
"item": "create:brass_nugget",
"value": 0.11112
},
{
"item": "create:brass_block",
"value": 9.0
},
{
"item": "create:brass_sheet",
"value": 1.0
}
]
}

View File

@ -0,0 +1,60 @@
{
"translation": "Refined Radiance ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "create:refined_radiance"
},
"hardness": 7.4,
"density": 2.0,
"flexibility": 4,
"durability": 2500,
"enchantability": 28,
"toughness": 4,
"tier": 6,
"mining_speed": 12,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 40,
"armor_toughness": 3.0,
"color": "FFFFFE",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "545849",
"68": "a2a98c",
"107": "c5ceb7",
"150": "d5dec8",
"190": "fffff6",
"216": "fffffe",
"255": "fffffe"
},
"filler": "interpolate"
},
"textures": [
"emissive",
"metallic"
],
"properties": {
"default": {
"fire_proof": true,
"emissive": {
"sky": 15,
"block": 15
}
},
"tool": {
"luminious_learning": "1"
},
"handheld": {
"illager_bane": "1"
}
},
"items": [
{
"item": "create:refined_radiance",
"value": 1.0
}
]
}

View File

@ -0,0 +1,52 @@
{
"translation": "Shadow Steel ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "create:shadow_steel"
},
"hardness": 8.2,
"density": 4.8,
"flexibility": 2,
"durability": 2700,
"enchantability": 14,
"toughness": 4,
"tier": 6,
"mining_speed": 10,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 42,
"armor_toughness": 3.5,
"color": "605E6B",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "0a0716",
"68": "140e2a",
"107": "1c162c",
"150": "38304d",
"190": "575366",
"216": "605e6b",
"255": "665d78"
},
"filler": "interpolate"
},
"textures": [
"metallic"
],
"properties": {
"default": {
"fire_proof": true
},
"handheld": {
"leeching": "1"
}
},
"items": [
{
"item": "create:shadow_steel",
"value": 1.0
}
]
}

View File

@ -0,0 +1,52 @@
{
"translation": "Zinc ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "create:zinc_ingot"
},
"hardness": 3.8,
"density": 3.0,
"flexibility": 1.5,
"durability": 180,
"enchantability": 15,
"toughness": 0,
"tier": 2,
"mining_speed": 5,
"mining_level": "minecraft:incorrect_for_stone_tool",
"armor_durability": 10,
"color": "B9E9C1",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "111f21",
"68": "213b3f",
"107": "31544e",
"150": "506d63",
"190": "a5c0a0",
"216": "b9e9c1",
"255": "d6ffdc"
},
"filler": "interpolate"
},
"textures": [
"metallic",
"bright"
],
"items": [
{
"item": "create:zinc_ingot",
"value": 1.0
},
{
"item": "create:zinc_nugget",
"value": 0.11112
},
{
"item": "create:zinc_block",
"value": 9.0
}
]
}

View File

@ -0,0 +1,6 @@
{
"pack": {
"description": "Create Materials for Truly Modular",
"pack_format": 48
}
}

View File

@ -0,0 +1,52 @@
{
"translation": "Dragonbone ",
"groups": [
"bone"
],
"icon": {
"type": "item",
"item": "iceandfire:dragonbone"
},
"hardness": 6.2,
"density": 4.4,
"flexibility": 3,
"durability": 700,
"enchantability": 12,
"toughness": 2,
"tier": 4,
"mining_speed": 7,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 24,
"color": "928880",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "140c0c",
"68": "271817",
"107": "271817",
"150": "4f433c",
"190": "736f6c",
"216": "928880",
"255": "b7a899"
},
"filler": "interpolate"
},
"textures": [
"rough"
],
"properties": {
"head": {
"fracturing": "10"
}
},
"items": [
{
"item": "iceandfire:dragonbone",
"value": 1.0
},
{
"item": "iceandfire:dragon_bone_block",
"value": 4.0
}
]
}

View File

@ -0,0 +1,55 @@
{
"translation": "Talon ",
"groups": [
"bone"
],
"icon": {
"type": "item",
"item": "iceandfire:hippogryph_talon"
},
"hardness": 6.6,
"density": 2.4,
"flexibility": 2,
"durability": 300,
"enchantability": 14,
"toughness": 0,
"tier": 3,
"mining_speed": 6,
"mining_level": "minecraft:incorrect_for_iron_tool",
"armor_durability": 14,
"color": "5C5859",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "0a080b",
"68": "131015",
"107": "131015",
"150": "312b31",
"190": "43373e",
"216": "5c5859",
"255": "706868"
},
"filler": "interpolate"
},
"textures": [
"rough"
],
"properties": {
"handheld": {
"attributes": [
{
"attribute": "generic.attack_speed",
"value": "0.08",
"operation": "+",
"slot": "mainhand"
}
]
}
},
"items": [
{
"item": "iceandfire:hippogryph_talon",
"value": 1.0
}
]
}

View File

@ -0,0 +1,55 @@
{
"translation": "Witherbone ",
"groups": [
"bone"
],
"icon": {
"type": "item",
"item": "iceandfire:witherbone"
},
"hardness": 5.8,
"density": 4.6,
"flexibility": 3,
"durability": 520,
"enchantability": 10,
"toughness": 1,
"tier": 3,
"mining_speed": 6,
"mining_level": "minecraft:incorrect_for_iron_tool",
"armor_durability": 20,
"color": "715671",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "161b22",
"68": "2a3341",
"107": "2a3341",
"150": "55465f",
"190": "715671",
"216": "715671",
"255": "897d95"
},
"filler": "interpolate"
},
"textures": [
"rough"
],
"properties": {
"head": {
"fracturing": "15"
},
"handheld": {
"leeching": "0.5"
}
},
"items": [
{
"item": "iceandfire:witherbone",
"value": 1.0
},
{
"item": "iceandfire:wither_shard",
"value": 0.25
}
]
}

View File

@ -0,0 +1,9 @@
{
"key": "miapi:crystal/amethyst",
"items": [
{
"item": "iceandfire:amethyst_gem",
"value": 1.0
}
]
}

View File

@ -0,0 +1,50 @@
{
"translation": "Dread ",
"groups": [
"crystal",
"metal"
],
"icon": {
"type": "item",
"item": "iceandfire:dread_shard"
},
"hardness": 6.4,
"density": 3.0,
"flexibility": 2,
"durability": 1100,
"enchantability": 16,
"toughness": 2,
"tier": 5,
"mining_speed": 8,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 28,
"color": "C5E4D8",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "0c0e44",
"68": "181b82",
"107": "2b3b53",
"150": "4c6c77",
"190": "86b1b0",
"216": "c5e4d8",
"255": "fffee6"
},
"filler": "interpolate"
},
"textures": [
"crystal",
"rough"
],
"properties": {
"handheld": {
"leeching": "1"
}
},
"items": [
{
"item": "iceandfire:dread_shard",
"value": 1.0
}
]
}

View File

@ -0,0 +1,55 @@
{
"translation": "Pixie Dust ",
"groups": [
"crystal"
],
"icon": {
"type": "item",
"item": "iceandfire:pixie_dust"
},
"hardness": 4.0,
"density": 0.5,
"flexibility": 6,
"durability": 220,
"enchantability": 34,
"toughness": 0,
"tier": 3,
"mining_speed": 9,
"mining_level": "minecraft:incorrect_for_iron_tool",
"armor_durability": 10,
"color": "F197E1",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "290d36",
"68": "4f1968",
"107": "4f1968",
"150": "4c3da8",
"190": "ae5fbe",
"216": "f197e1",
"255": "ffd9e0"
},
"filler": "interpolate"
},
"textures": [
"emissive",
"crystal"
],
"properties": {
"default": {
"emissive": {
"sky": 7,
"block": 7
}
},
"tool": {
"luminious_learning": "1"
}
},
"items": [
{
"item": "iceandfire:pixie_dust",
"value": 1.0
}
]
}

View File

@ -0,0 +1,49 @@
{
"translation": "Sapphire ",
"groups": [
"crystal",
"gem"
],
"icon": {
"type": "item",
"item": "iceandfire:sapphire_gem"
},
"hardness": 6.2,
"density": 2.2,
"flexibility": 0,
"durability": 1200,
"enchantability": 14,
"toughness": 2,
"tier": 4,
"mining_speed": 8,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 30,
"color": "69FED7",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "0c0e44",
"68": "181b82",
"107": "3a279a",
"150": "5d33b2",
"190": "4d8fd1",
"216": "69fed7",
"255": "fffee6"
},
"filler": "interpolate"
},
"textures": [
"crystal",
"bright"
],
"items": [
{
"item": "iceandfire:sapphire_gem",
"value": 1.0
},
{
"item": "iceandfire:sapphire_block",
"value": 9.0
}
]
}

View File

@ -0,0 +1,51 @@
{
"translation": "Forest Troll Leather ",
"groups": [
"fabric",
"leather"
],
"icon": {
"type": "item",
"item": "iceandfire:troll_leather_forest"
},
"hardness": 3.6,
"density": 1.8,
"flexibility": 5,
"durability": 400,
"enchantability": 12,
"toughness": 2,
"tier": 3,
"mining_speed": 0,
"mining_level": "minecraft:incorrect_for_wooden_tool",
"armor_durability": 22,
"color": "597A56",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "0c0e11",
"68": "181a21",
"107": "181a21",
"150": "343a3c",
"190": "475b54",
"216": "597a56",
"255": "597a56"
},
"filler": "interpolate"
},
"textures": [
"fabric"
],
"properties": {
"armor": {
"fake_enchants": {
"minecraft:projectile_protection": 2
}
}
},
"items": [
{
"item": "iceandfire:troll_leather_forest",
"value": 1.0
}
]
}

View File

@ -0,0 +1,57 @@
{
"translation": "Frost Troll Leather ",
"groups": [
"fabric",
"leather"
],
"icon": {
"type": "item",
"item": "iceandfire:troll_leather_frost"
},
"hardness": 3.6,
"density": 1.8,
"flexibility": 5,
"durability": 400,
"enchantability": 12,
"toughness": 2,
"tier": 3,
"mining_speed": 0,
"mining_level": "minecraft:incorrect_for_wooden_tool",
"armor_durability": 22,
"color": "5B797E",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "0a0b12",
"68": "141523",
"107": "141523",
"150": "2f3342",
"190": "3b4d5e",
"216": "5b797e",
"255": "5b797e"
},
"filler": "interpolate"
},
"textures": [
"fabric"
],
"properties": {
"armor": {
"fake_enchants": {
"minecraft:projectile_protection": 2
},
"fake_item_tag": [
"minecraft:freeze_immune_wearables"
]
},
"boot": {
"can_walk_on_snow": true
}
},
"items": [
{
"item": "iceandfire:troll_leather_frost",
"value": 1.0
}
]
}

View File

@ -0,0 +1,51 @@
{
"translation": "Mountain Troll Leather ",
"groups": [
"fabric",
"leather"
],
"icon": {
"type": "item",
"item": "iceandfire:troll_leather_mountain"
},
"hardness": 3.6,
"density": 1.8,
"flexibility": 5,
"durability": 400,
"enchantability": 12,
"toughness": 2,
"tier": 3,
"mining_speed": 0,
"mining_level": "minecraft:incorrect_for_wooden_tool",
"armor_durability": 22,
"color": "9C90B0",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "0a0a0f",
"68": "14141d",
"107": "36343f",
"150": "656468",
"190": "807f8c",
"216": "9c90b0",
"255": "9c90b0"
},
"filler": "interpolate"
},
"textures": [
"fabric"
],
"properties": {
"armor": {
"fake_enchants": {
"minecraft:projectile_protection": 2
}
}
},
"items": [
{
"item": "iceandfire:troll_leather_mountain",
"value": 1.0
}
]
}

View File

@ -0,0 +1,44 @@
{
"translation": "Amphithere ",
"groups": [
"fletching",
"feather"
],
"icon": {
"type": "item",
"item": "iceandfire:amphithere_feather"
},
"hardness": 2.6,
"density": 0.3,
"flexibility": 7,
"durability": 120,
"enchantability": 18,
"toughness": 0,
"tier": 3,
"mining_speed": 0,
"mining_level": "minecraft:incorrect_for_wooden_tool",
"armor_durability": 8,
"color": "219DB8",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "2c0606",
"68": "550b0b",
"107": "592912",
"150": "881d46",
"190": "794d20",
"216": "219db8",
"255": "52ed77"
},
"filler": "interpolate"
},
"textures": [
"feather"
],
"items": [
{
"item": "iceandfire:amphithere_feather",
"value": 1.0
}
]
}

View File

@ -0,0 +1,48 @@
{
"translation": "Stymphalian ",
"groups": [
"fletching",
"feather"
],
"icon": {
"type": "item",
"item": "iceandfire:stymphalian_bird_feather"
},
"hardness": 3.4,
"density": 0.4,
"flexibility": 6,
"durability": 140,
"enchantability": 15,
"toughness": 0,
"tier": 3,
"mining_speed": 0,
"mining_level": "minecraft:incorrect_for_wooden_tool",
"armor_durability": 8,
"color": "795C48",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "16100b",
"68": "2b2016",
"107": "32241a",
"150": "4c3728",
"190": "6e5039",
"216": "795c48",
"255": "967e70"
},
"filler": "interpolate"
},
"textures": [
"feather"
],
"items": [
{
"item": "iceandfire:stymphalian_bird_feather",
"value": 1.0
},
{
"item": "iceandfire:stymphalian_feather_bundle",
"value": 4.0
}
]
}

View File

@ -0,0 +1,61 @@
{
"translation": "Fire Dragonsteel ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "iceandfire:dragonsteel_fire_ingot"
},
"hardness": 9.0,
"density": 4.0,
"flexibility": 3,
"durability": 3600,
"enchantability": 18,
"toughness": 5,
"tier": 7,
"mining_speed": 13,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 50,
"armor_toughness": 5.0,
"color": "FFDB8E",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "160e16",
"68": "2b1a2b",
"107": "553f4b",
"150": "e04029",
"190": "fc9f4e",
"216": "ffdb8e",
"255": "fffed8"
},
"filler": "interpolate"
},
"textures": [
"emissive",
"metallic"
],
"properties": {
"default": {
"fire_proof": true,
"emissive": {
"sky": 6,
"block": 6
}
},
"handheld": {
"immolate": "3"
}
},
"items": [
{
"item": "iceandfire:dragonsteel_fire_ingot",
"value": 1.0
},
{
"item": "iceandfire:dragonsteel_fire_block",
"value": 9.0
}
]
}

View File

@ -0,0 +1,59 @@
{
"translation": "Ice Dragonsteel ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "iceandfire:dragonsteel_ice_ingot"
},
"hardness": 8.8,
"density": 4.2,
"flexibility": 3,
"durability": 3600,
"enchantability": 18,
"toughness": 5,
"tier": 7,
"mining_speed": 13,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 50,
"armor_toughness": 5.0,
"color": "C6DAED",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "08071b",
"68": "100d34",
"107": "2b3564",
"150": "345572",
"190": "9a9ca8",
"216": "c6daed",
"255": "fffded"
},
"filler": "interpolate"
},
"textures": [
"metallic",
"bright"
],
"properties": {
"armor": {
"fake_item_tag": [
"minecraft:freeze_immune_wearables"
]
},
"boot": {
"can_walk_on_snow": true
}
},
"items": [
{
"item": "iceandfire:dragonsteel_ice_ingot",
"value": 1.0
},
{
"item": "iceandfire:dragonsteel_ice_block",
"value": 9.0
}
]
}

View File

@ -0,0 +1,67 @@
{
"translation": "Lightning Dragonsteel ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "iceandfire:dragonsteel_lightning_ingot"
},
"hardness": 8.8,
"density": 3.4,
"flexibility": 4,
"durability": 3600,
"enchantability": 20,
"toughness": 5,
"tier": 7,
"mining_speed": 14,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 50,
"armor_toughness": 5.0,
"color": "EBB9DB",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "08071b",
"68": "100d34",
"107": "423846",
"150": "797479",
"190": "ebb9db",
"216": "ebb9db",
"255": "ffffff"
},
"filler": "interpolate"
},
"textures": [
"emissive",
"metallic"
],
"properties": {
"default": {
"emissive": {
"sky": 8,
"block": 8
}
},
"handheld": {
"attributes": [
{
"attribute": "generic.attack_speed",
"value": "0.15",
"operation": "+",
"slot": "mainhand"
}
]
}
},
"items": [
{
"item": "iceandfire:dragonsteel_lightning_ingot",
"value": 1.0
},
{
"item": "iceandfire:dragonsteel_lightning_block",
"value": 9.0
}
]
}

View File

@ -0,0 +1,62 @@
{
"translation": "Phantasmal ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "iceandfire:ghost_ingot"
},
"hardness": 6.0,
"density": 0.6,
"flexibility": 5,
"durability": 1300,
"enchantability": 26,
"toughness": 2,
"tier": 5,
"mining_speed": 10,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 28,
"color": "A2EABD",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "060c1f",
"68": "0c173c",
"107": "28546e",
"150": "3e9084",
"190": "67c7ad",
"216": "a2eabd",
"255": "f2fff4"
},
"filler": "interpolate"
},
"textures": [
"emissive",
"metallic"
],
"properties": {
"default": {
"emissive": {
"sky": 6,
"block": 6
}
},
"handheld": {
"attributes": [
{
"attribute": "generic.attack_speed",
"value": "0.12",
"operation": "+",
"slot": "mainhand"
}
]
}
},
"items": [
{
"item": "iceandfire:ghost_ingot",
"value": 1.0
}
]
}

View File

@ -0,0 +1,59 @@
{
"translation": "Silver ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "iceandfire:silver_ingot"
},
"hardness": 4.6,
"density": 3.4,
"flexibility": 2,
"durability": 220,
"enchantability": 20,
"toughness": 0,
"tier": 3,
"mining_speed": 7,
"mining_level": "minecraft:incorrect_for_iron_tool",
"armor_durability": 13,
"color": "D2CBC5",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "0b090e",
"68": "16121b",
"107": "3f303f",
"150": "725e6c",
"190": "a19090",
"216": "d2cbc5",
"255": "ffffff"
},
"filler": "interpolate"
},
"textures": [
"metallic",
"bright"
],
"properties": {
"handheld": {
"fake_enchants": {
"minecraft:smite": 2
}
}
},
"items": [
{
"item": "iceandfire:silver_ingot",
"value": 1.0
},
{
"item": "iceandfire:silver_nugget",
"value": 0.11112
},
{
"item": "iceandfire:silver_block",
"value": 9.0
}
]
}

View File

@ -0,0 +1,49 @@
{
"translation": "Red Chitin ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:deathworm_chitin_red"
},
"hardness": 5.6,
"density": 2.2,
"flexibility": 4,
"durability": 880,
"enchantability": 13,
"toughness": 3,
"tier": 4,
"mining_speed": 6,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 30,
"armor_toughness": 2.0,
"color": "C48080",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "15080f",
"68": "290f1c",
"107": "290f1c",
"150": "58232f",
"190": "854747",
"216": "c48080",
"255": "c48080"
},
"filler": "interpolate"
},
"textures": [
"rough"
],
"properties": {
"default": {
"fire_proof": true
}
},
"items": [
{
"item": "iceandfire:deathworm_chitin_red",
"value": 1.0
}
]
}

View File

@ -0,0 +1,49 @@
{
"translation": "White Chitin ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:deathworm_chitin_white"
},
"hardness": 5.6,
"density": 2.2,
"flexibility": 4,
"durability": 880,
"enchantability": 13,
"toughness": 3,
"tier": 4,
"mining_speed": 6,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 30,
"armor_toughness": 2.0,
"color": "DADAD4",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "0d1510",
"68": "19291e",
"107": "5a624a",
"150": "908f78",
"190": "b7aea2",
"216": "dadad4",
"255": "dadad4"
},
"filler": "interpolate"
},
"textures": [
"rough"
],
"properties": {
"default": {
"fire_proof": true
}
},
"items": [
{
"item": "iceandfire:deathworm_chitin_white",
"value": 1.0
}
]
}

View File

@ -0,0 +1,49 @@
{
"translation": "Tan Chitin ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:deathworm_chitin_yellow"
},
"hardness": 5.6,
"density": 2.2,
"flexibility": 4,
"durability": 880,
"enchantability": 13,
"toughness": 3,
"tier": 4,
"mining_speed": 6,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 30,
"armor_toughness": 2.0,
"color": "C5A981",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "24100c",
"68": "451f17",
"107": "451f17",
"150": "6d432e",
"190": "9b7753",
"216": "c5a981",
"255": "c5a981"
},
"filler": "interpolate"
},
"textures": [
"rough"
],
"properties": {
"default": {
"fire_proof": true
}
},
"items": [
{
"item": "iceandfire:deathworm_chitin_yellow",
"value": 1.0
}
]
}

View File

@ -0,0 +1,67 @@
{
"translation": "Amethyst Dragonscale ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:dragonscales_amethyst"
},
"hardness": 6.0,
"density": 2.6,
"flexibility": 4,
"durability": 1500,
"enchantability": 15,
"toughness": 4,
"tier": 5,
"mining_speed": 7,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 44,
"armor_toughness": 3.5,
"color": "FAB7C2",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "1f1030",
"68": "3c1f5c",
"107": "7e3a8b",
"150": "99469c",
"190": "e68cb6",
"216": "fab7c2",
"255": "ffe9e9"
},
"filler": "interpolate"
},
"textures": [
"rough",
"shiny"
],
"properties": {
"default": {
"emissive": {
"sky": 5,
"block": 5
}
},
"handheld": {
"attributes": [
{
"attribute": "generic.attack_speed",
"value": "0.08",
"operation": "+",
"slot": "mainhand"
}
]
}
},
"items": [
{
"item": "iceandfire:dragonscales_amethyst",
"value": 1.0
},
{
"item": "iceandfire:dragonscale_amethyst",
"value": 9.0
}
]
}

View File

@ -0,0 +1,67 @@
{
"translation": "Black Dragonscale ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:dragonscales_black"
},
"hardness": 6.0,
"density": 2.6,
"flexibility": 4,
"durability": 1500,
"enchantability": 15,
"toughness": 4,
"tier": 5,
"mining_speed": 7,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 44,
"armor_toughness": 3.5,
"color": "6C696B",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "110f15",
"68": "211c28",
"107": "28212c",
"150": "2e2631",
"190": "494149",
"216": "6c696b",
"255": "969495"
},
"filler": "interpolate"
},
"textures": [
"rough",
"shiny"
],
"properties": {
"default": {
"emissive": {
"sky": 5,
"block": 5
}
},
"handheld": {
"attributes": [
{
"attribute": "generic.attack_speed",
"value": "0.08",
"operation": "+",
"slot": "mainhand"
}
]
}
},
"items": [
{
"item": "iceandfire:dragonscales_black",
"value": 1.0
},
{
"item": "iceandfire:dragonscale_black",
"value": 9.0
}
]
}

View File

@ -0,0 +1,59 @@
{
"translation": "Blue Dragonscale ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:dragonscales_blue"
},
"hardness": 6.0,
"density": 2.6,
"flexibility": 4,
"durability": 1500,
"enchantability": 15,
"toughness": 4,
"tier": 5,
"mining_speed": 7,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 44,
"armor_toughness": 3.5,
"color": "DBE4E3",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "110c23",
"68": "211743",
"107": "211743",
"150": "485d89",
"190": "80b0c1",
"216": "dbe4e3",
"255": "dbe4e3"
},
"filler": "interpolate"
},
"textures": [
"rough",
"shiny"
],
"properties": {
"armor": {
"fake_item_tag": [
"minecraft:freeze_immune_wearables"
]
},
"boot": {
"can_walk_on_snow": true
}
},
"items": [
{
"item": "iceandfire:dragonscales_blue",
"value": 1.0
},
{
"item": "iceandfire:dragonscale_blue",
"value": 9.0
}
]
}

View File

@ -0,0 +1,59 @@
{
"translation": "Bronze Dragonscale ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:dragonscales_bronze"
},
"hardness": 6.0,
"density": 2.6,
"flexibility": 4,
"durability": 1500,
"enchantability": 15,
"toughness": 4,
"tier": 5,
"mining_speed": 7,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 44,
"armor_toughness": 3.5,
"color": "CC9670",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "200411",
"68": "3e0720",
"107": "521826",
"150": "77372c",
"190": "9b6846",
"216": "cc9670",
"255": "ffedbd"
},
"filler": "interpolate"
},
"textures": [
"rough",
"shiny"
],
"properties": {
"default": {
"fire_proof": true
},
"armor": {
"fake_enchants": {
"minecraft:fire_protection": 2
}
}
},
"items": [
{
"item": "iceandfire:dragonscales_bronze",
"value": 1.0
},
{
"item": "iceandfire:dragonscale_bronze",
"value": 9.0
}
]
}

View File

@ -0,0 +1,67 @@
{
"translation": "Copper Dragonscale ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:dragonscales_copper"
},
"hardness": 6.0,
"density": 2.6,
"flexibility": 4,
"durability": 1500,
"enchantability": 15,
"toughness": 4,
"tier": 5,
"mining_speed": 7,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 44,
"armor_toughness": 3.5,
"color": "CD8E51",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "22040a",
"68": "420713",
"107": "590e0e",
"150": "902e24",
"190": "a1422e",
"216": "cd8e51",
"255": "f0ce82"
},
"filler": "interpolate"
},
"textures": [
"rough",
"shiny"
],
"properties": {
"default": {
"emissive": {
"sky": 5,
"block": 5
}
},
"handheld": {
"attributes": [
{
"attribute": "generic.attack_speed",
"value": "0.08",
"operation": "+",
"slot": "mainhand"
}
]
}
},
"items": [
{
"item": "iceandfire:dragonscales_copper",
"value": 1.0
},
{
"item": "iceandfire:dragonscale_copper",
"value": 9.0
}
]
}

View File

@ -0,0 +1,67 @@
{
"translation": "Electric Dragonscale ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:dragonscales_electric"
},
"hardness": 6.0,
"density": 2.6,
"flexibility": 4,
"durability": 1500,
"enchantability": 15,
"toughness": 4,
"tier": 5,
"mining_speed": 7,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 44,
"armor_toughness": 3.5,
"color": "795EBA",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "111111",
"68": "212121",
"107": "212121",
"150": "2b5471",
"190": "494c99",
"216": "795eba",
"255": "795eba"
},
"filler": "interpolate"
},
"textures": [
"rough",
"shiny"
],
"properties": {
"default": {
"emissive": {
"sky": 5,
"block": 5
}
},
"handheld": {
"attributes": [
{
"attribute": "generic.attack_speed",
"value": "0.08",
"operation": "+",
"slot": "mainhand"
}
]
}
},
"items": [
{
"item": "iceandfire:dragonscales_electric",
"value": 1.0
},
{
"item": "iceandfire:dragonscale_electric",
"value": 9.0
}
]
}

View File

@ -0,0 +1,59 @@
{
"translation": "Gray Dragonscale ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:dragonscales_gray"
},
"hardness": 6.0,
"density": 2.6,
"flexibility": 4,
"durability": 1500,
"enchantability": 15,
"toughness": 4,
"tier": 5,
"mining_speed": 7,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 44,
"armor_toughness": 3.5,
"color": "654575",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "050b12",
"68": "0a1622",
"107": "1e2230",
"150": "1b233f",
"190": "392d55",
"216": "654575",
"255": "826084"
},
"filler": "interpolate"
},
"textures": [
"rough",
"shiny"
],
"properties": {
"default": {
"fire_proof": true
},
"armor": {
"fake_enchants": {
"minecraft:fire_protection": 2
}
}
},
"items": [
{
"item": "iceandfire:dragonscales_gray",
"value": 1.0
},
{
"item": "iceandfire:dragonscale_gray",
"value": 9.0
}
]
}

View File

@ -0,0 +1,59 @@
{
"translation": "Green Dragonscale ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:dragonscales_green"
},
"hardness": 6.0,
"density": 2.6,
"flexibility": 4,
"durability": 1500,
"enchantability": 15,
"toughness": 4,
"tier": 5,
"mining_speed": 7,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 44,
"armor_toughness": 3.5,
"color": "3C5084",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "210820",
"68": "40103e",
"107": "40103e",
"150": "461d5a",
"190": "3c5084",
"216": "3c5084",
"255": "41836b"
},
"filler": "interpolate"
},
"textures": [
"rough",
"shiny"
],
"properties": {
"default": {
"fire_proof": true
},
"armor": {
"fake_enchants": {
"minecraft:fire_protection": 2
}
}
},
"items": [
{
"item": "iceandfire:dragonscales_green",
"value": 1.0
},
{
"item": "iceandfire:dragonscale_green",
"value": 9.0
}
]
}

View File

@ -0,0 +1,59 @@
{
"translation": "Red Dragonscale ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:dragonscales_red"
},
"hardness": 6.0,
"density": 2.6,
"flexibility": 4,
"durability": 1500,
"enchantability": 15,
"toughness": 4,
"tier": 5,
"mining_speed": 7,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 44,
"armor_toughness": 3.5,
"color": "C92626",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "220118",
"68": "41022f",
"107": "41022f",
"150": "660628",
"190": "941119",
"216": "c92626",
"255": "e9604d"
},
"filler": "interpolate"
},
"textures": [
"rough",
"shiny"
],
"properties": {
"default": {
"fire_proof": true
},
"armor": {
"fake_enchants": {
"minecraft:fire_protection": 2
}
}
},
"items": [
{
"item": "iceandfire:dragonscales_red",
"value": 1.0
},
{
"item": "iceandfire:dragonscale_red",
"value": 9.0
}
]
}

View File

@ -0,0 +1,59 @@
{
"translation": "Sapphire Dragonscale ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:dragonscales_sapphire"
},
"hardness": 6.0,
"density": 2.6,
"flexibility": 4,
"durability": 1500,
"enchantability": 15,
"toughness": 4,
"tier": 5,
"mining_speed": 7,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 44,
"armor_toughness": 3.5,
"color": "94CEDE",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "070720",
"68": "0e0e3d",
"107": "211743",
"150": "353b7c",
"190": "6487b2",
"216": "94cede",
"255": "99fff5"
},
"filler": "interpolate"
},
"textures": [
"rough",
"shiny"
],
"properties": {
"armor": {
"fake_item_tag": [
"minecraft:freeze_immune_wearables"
]
},
"boot": {
"can_walk_on_snow": true
}
},
"items": [
{
"item": "iceandfire:dragonscales_sapphire",
"value": 1.0
},
{
"item": "iceandfire:dragonscale_sapphire",
"value": 9.0
}
]
}

View File

@ -0,0 +1,59 @@
{
"translation": "Silver Dragonscale ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:dragonscales_silver"
},
"hardness": 6.0,
"density": 2.6,
"flexibility": 4,
"durability": 1500,
"enchantability": 15,
"toughness": 4,
"tier": 5,
"mining_speed": 7,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 44,
"armor_toughness": 3.5,
"color": "CEE8EE",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "1d1a2e",
"68": "383258",
"107": "4a4d78",
"150": "7483a1",
"190": "a2b4ca",
"216": "cee8ee",
"255": "f8fdff"
},
"filler": "interpolate"
},
"textures": [
"rough",
"shiny"
],
"properties": {
"armor": {
"fake_item_tag": [
"minecraft:freeze_immune_wearables"
]
},
"boot": {
"can_walk_on_snow": true
}
},
"items": [
{
"item": "iceandfire:dragonscales_silver",
"value": 1.0
},
{
"item": "iceandfire:dragonscale_silver",
"value": 9.0
}
]
}

View File

@ -0,0 +1,59 @@
{
"translation": "White Dragonscale ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:dragonscales_white"
},
"hardness": 6.0,
"density": 2.6,
"flexibility": 4,
"durability": 1500,
"enchantability": 15,
"toughness": 4,
"tier": 5,
"mining_speed": 7,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 44,
"armor_toughness": 3.5,
"color": "E2F0F3",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "2a2c37",
"68": "51556a",
"107": "72748a",
"150": "72748a",
"190": "cad3d9",
"216": "e2f0f3",
"255": "f8fdff"
},
"filler": "interpolate"
},
"textures": [
"rough",
"shiny"
],
"properties": {
"armor": {
"fake_item_tag": [
"minecraft:freeze_immune_wearables"
]
},
"boot": {
"can_walk_on_snow": true
}
},
"items": [
{
"item": "iceandfire:dragonscales_white",
"value": 1.0
},
{
"item": "iceandfire:dragonscale_white",
"value": 9.0
}
]
}

View File

@ -0,0 +1,61 @@
{
"translation": "Blue Serpent Scale ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:sea_serpent_scales_blue"
},
"hardness": 5.4,
"density": 2.4,
"flexibility": 5,
"durability": 950,
"enchantability": 16,
"toughness": 3,
"tier": 4,
"mining_speed": 6,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 32,
"armor_toughness": 2.5,
"color": "53719C",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "0e081c",
"68": "1b1035",
"107": "272a57",
"150": "272a57",
"190": "4c6288",
"216": "53719c",
"255": "569dc3"
},
"filler": "interpolate"
},
"textures": [
"rough",
"shiny"
],
"properties": {
"armor": {
"fake_enchants": {
"minecraft:respiration": 1
}
},
"boot": {
"fake_enchants": {
"minecraft:depth_strider": 1
}
}
},
"items": [
{
"item": "iceandfire:sea_serpent_scales_blue",
"value": 1.0
},
{
"item": "iceandfire:sea_serpent_scale_block_blue",
"value": 9.0
}
]
}

View File

@ -0,0 +1,61 @@
{
"translation": "Bronze Serpent Scale ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:sea_serpent_scales_bronze"
},
"hardness": 5.4,
"density": 2.4,
"flexibility": 5,
"durability": 950,
"enchantability": 16,
"toughness": 3,
"tier": 4,
"mining_speed": 6,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 32,
"armor_toughness": 2.5,
"color": "CC9670",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "2b0c14",
"68": "521826",
"107": "77372c",
"150": "77372c",
"190": "cc9670",
"216": "cc9670",
"255": "f1dead"
},
"filler": "interpolate"
},
"textures": [
"rough",
"shiny"
],
"properties": {
"armor": {
"fake_enchants": {
"minecraft:respiration": 1
}
},
"boot": {
"fake_enchants": {
"minecraft:depth_strider": 1
}
}
},
"items": [
{
"item": "iceandfire:sea_serpent_scales_bronze",
"value": 1.0
},
{
"item": "iceandfire:sea_serpent_scale_block_bronze",
"value": 9.0
}
]
}

View File

@ -0,0 +1,61 @@
{
"translation": "Deep Blue Serpent Scale ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:sea_serpent_scales_deepblue"
},
"hardness": 5.4,
"density": 2.4,
"flexibility": 5,
"durability": 950,
"enchantability": 16,
"toughness": 3,
"tier": 4,
"mining_speed": 6,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 32,
"armor_toughness": 2.5,
"color": "384291",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "18121f",
"68": "2e233b",
"107": "2e233b",
"150": "363168",
"190": "384291",
"216": "384291",
"255": "6381bb"
},
"filler": "interpolate"
},
"textures": [
"rough",
"shiny"
],
"properties": {
"armor": {
"fake_enchants": {
"minecraft:respiration": 1
}
},
"boot": {
"fake_enchants": {
"minecraft:depth_strider": 1
}
}
},
"items": [
{
"item": "iceandfire:sea_serpent_scales_deepblue",
"value": 1.0
},
{
"item": "iceandfire:sea_serpent_scale_block_deepblue",
"value": 9.0
}
]
}

View File

@ -0,0 +1,61 @@
{
"translation": "Green Serpent Scale ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:sea_serpent_scales_green"
},
"hardness": 5.4,
"density": 2.4,
"flexibility": 5,
"durability": 950,
"enchantability": 16,
"toughness": 3,
"tier": 4,
"mining_speed": 6,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 32,
"armor_toughness": 2.5,
"color": "67CEAF",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "0a1c16",
"68": "13362b",
"107": "2e5f2d",
"150": "2e5f2d",
"190": "67ceaf",
"216": "67ceaf",
"255": "9ef7b6"
},
"filler": "interpolate"
},
"textures": [
"rough",
"shiny"
],
"properties": {
"armor": {
"fake_enchants": {
"minecraft:respiration": 1
}
},
"boot": {
"fake_enchants": {
"minecraft:depth_strider": 1
}
}
},
"items": [
{
"item": "iceandfire:sea_serpent_scales_green",
"value": 1.0
},
{
"item": "iceandfire:sea_serpent_scale_block_green",
"value": 9.0
}
]
}

View File

@ -0,0 +1,61 @@
{
"translation": "Purple Serpent Scale ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:sea_serpent_scales_purple"
},
"hardness": 5.4,
"density": 2.4,
"flexibility": 5,
"durability": 950,
"enchantability": 16,
"toughness": 3,
"tier": 4,
"mining_speed": 6,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 32,
"armor_toughness": 2.5,
"color": "7D6988",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "060910",
"68": "0b121f",
"107": "2d2a49",
"150": "585262",
"190": "7d6988",
"216": "7d6988",
"255": "b470b6"
},
"filler": "interpolate"
},
"textures": [
"rough",
"shiny"
],
"properties": {
"armor": {
"fake_enchants": {
"minecraft:respiration": 1
}
},
"boot": {
"fake_enchants": {
"minecraft:depth_strider": 1
}
}
},
"items": [
{
"item": "iceandfire:sea_serpent_scales_purple",
"value": 1.0
},
{
"item": "iceandfire:sea_serpent_scale_block_purple",
"value": 9.0
}
]
}

View File

@ -0,0 +1,61 @@
{
"translation": "Red Serpent Scale ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:sea_serpent_scales_red"
},
"hardness": 5.4,
"density": 2.4,
"flexibility": 5,
"durability": 950,
"enchantability": 16,
"toughness": 3,
"tier": 4,
"mining_speed": 6,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 32,
"armor_toughness": 2.5,
"color": "B55177",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "1d0412",
"68": "380823",
"107": "442238",
"150": "442238",
"190": "b55177",
"216": "b55177",
"255": "d17c88"
},
"filler": "interpolate"
},
"textures": [
"rough",
"shiny"
],
"properties": {
"armor": {
"fake_enchants": {
"minecraft:respiration": 1
}
},
"boot": {
"fake_enchants": {
"minecraft:depth_strider": 1
}
}
},
"items": [
{
"item": "iceandfire:sea_serpent_scales_red",
"value": 1.0
},
{
"item": "iceandfire:sea_serpent_scale_block_red",
"value": 9.0
}
]
}

View File

@ -0,0 +1,61 @@
{
"translation": "Teal Serpent Scale ",
"groups": [
"scute"
],
"icon": {
"type": "item",
"item": "iceandfire:sea_serpent_scales_teal"
},
"hardness": 5.4,
"density": 2.4,
"flexibility": 5,
"durability": 950,
"enchantability": 16,
"toughness": 3,
"tier": 4,
"mining_speed": 6,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 32,
"armor_toughness": 2.5,
"color": "336F95",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "1a1821",
"68": "322e40",
"107": "322e40",
"150": "41476d",
"190": "336f95",
"216": "336f95",
"255": "52adb9"
},
"filler": "interpolate"
},
"textures": [
"rough",
"shiny"
],
"properties": {
"armor": {
"fake_enchants": {
"minecraft:respiration": 1
}
},
"boot": {
"fake_enchants": {
"minecraft:depth_strider": 1
}
}
},
"items": [
{
"item": "iceandfire:sea_serpent_scales_teal",
"value": 1.0
},
{
"item": "iceandfire:sea_serpent_scale_block_teal",
"value": 9.0
}
]
}

View File

@ -0,0 +1,6 @@
{
"pack": {
"description": "Ice and Fire Materials for Truly Modular",
"pack_format": 48
}
}

View File

@ -0,0 +1,50 @@
{
"translation": "Silicon Carbide ",
"groups": [
"crystal"
],
"icon": {
"type": "item",
"item": "vsie:silicon_carbide"
},
"hardness": 7.6,
"density": 2.4,
"flexibility": 0,
"durability": 1300,
"enchantability": 12,
"toughness": 3,
"tier": 5,
"mining_speed": 13,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 34,
"armor_toughness": 3.0,
"color": "919191",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "303030",
"68": "5c5c5c",
"107": "6b6b6b",
"150": "7f7f7f",
"190": "8a8a8a",
"216": "919191",
"255": "00ccff"
},
"filler": "interpolate"
},
"textures": [
"crystal",
"rough"
],
"properties": {
"default": {
"fire_proof": true
}
},
"items": [
{
"item": "vsie:silicon_carbide",
"value": 1.0
}
]
}

View File

@ -0,0 +1,55 @@
{
"translation": "Computronic ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "vsie:computronic_substrate"
},
"hardness": 4.6,
"density": 1.8,
"flexibility": 3,
"durability": 1100,
"enchantability": 28,
"toughness": 2,
"tier": 5,
"mining_speed": 9,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 28,
"color": "FFFFFF",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "282828",
"68": "4c4c4c",
"107": "7f7f7f",
"150": "cccccc",
"190": "e2e2e2",
"216": "ffffff",
"255": "ffffff"
},
"filler": "interpolate"
},
"textures": [
"emissive",
"metallic"
],
"properties": {
"default": {
"emissive": {
"sky": 4,
"block": 4
}
},
"tool": {
"luminious_learning": "1"
}
},
"items": [
{
"item": "vsie:computronic_substrate",
"value": 1.0
}
]
}

View File

@ -0,0 +1,57 @@
{
"translation": "Microlattice ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "vsie:metalic_microlattice"
},
"hardness": 5.2,
"density": 0.3,
"flexibility": 7,
"durability": 1400,
"enchantability": 20,
"toughness": 2,
"tier": 5,
"mining_speed": 9,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 34,
"armor_toughness": 1.5,
"color": "67B6F9",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "1a476b",
"68": "3289ce",
"107": "388ed4",
"150": "3d93da",
"190": "59adf9",
"216": "67b6f9",
"255": "7fcbf2"
},
"filler": "interpolate"
},
"textures": [
"metallic",
"bright"
],
"properties": {
"handheld": {
"attributes": [
{
"attribute": "generic.attack_speed",
"value": "0.18",
"operation": "+",
"slot": "mainhand"
}
]
}
},
"items": [
{
"item": "vsie:metalic_microlattice",
"value": 1.0
}
]
}

View File

@ -0,0 +1,6 @@
{
"pack": {
"description": "Interstellar Expansion Materials for Truly Modular",
"pack_format": 48
}
}

View File

@ -0,0 +1,86 @@
{
"translation": "Arcane ",
"groups": [
"crystal",
"gem"
],
"icon": {
"type": "item",
"item": "irons_spellbooks:arcane_essence"
},
"hardness": 6.8,
"density": 1.4,
"flexibility": 5,
"durability": 2400,
"enchantability": 32,
"toughness": 3,
"tier": 6,
"mining_speed": 11,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 38,
"armor_toughness": 2.5,
"color": "89A5E2",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "230433",
"68": "440863",
"107": "440863",
"150": "64189a",
"190": "227c8f",
"216": "89a5e2",
"255": "7cd4ea"
},
"filler": "interpolate"
},
"textures": [
"crystal",
"bright"
],
"properties": {
"default": {
"emissive": {
"sky": 6,
"block": 6
}
},
"armor": {
"attributes": [
{
"attribute": "irons_spellbooks:max_mana",
"value": "100",
"operation": "+",
"slot": "armor"
},
{
"attribute": "irons_spellbooks:mana_regen",
"value": "0.15",
"operation": "*",
"slot": "armor"
}
]
},
"handheld": {
"attributes": [
{
"attribute": "irons_spellbooks:spell_power",
"value": "0.1",
"operation": "*",
"slot": "mainhand"
},
{
"attribute": "irons_spellbooks:cooldown_reduction",
"value": "0.05",
"operation": "*",
"slot": "mainhand"
}
]
}
},
"items": [
{
"item": "irons_spellbooks:arcane_essence",
"value": 1.0
}
]
}

View File

@ -0,0 +1,82 @@
{
"translation": "Cinder ",
"groups": [
"crystal",
"gem"
],
"icon": {
"type": "item",
"item": "irons_spellbooks:cinder_essence"
},
"hardness": 7.4,
"density": 2.6,
"flexibility": 3,
"durability": 2400,
"enchantability": 20,
"toughness": 4,
"tier": 6,
"mining_speed": 11,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 40,
"armor_toughness": 3.0,
"color": "423B3B",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "0b0808",
"68": "161010",
"107": "1f1212",
"150": "281f1f",
"190": "403131",
"216": "423b3b",
"255": "5c3f3f"
},
"filler": "interpolate"
},
"textures": [
"emissive",
"crystal"
],
"properties": {
"default": {
"fire_proof": true,
"emissive": {
"sky": 8,
"block": 8
}
},
"armor": {
"attributes": [
{
"attribute": "cmmodular:fire_immunity",
"value": "1",
"operation": "+",
"slot": "armor"
},
{
"attribute": "irons_spellbooks:fire_magic_resist",
"value": "0.2",
"operation": "*",
"slot": "armor"
}
]
},
"handheld": {
"immolate": "3",
"attributes": [
{
"attribute": "irons_spellbooks:fire_spell_power",
"value": "0.2",
"operation": "*",
"slot": "mainhand"
}
]
}
},
"items": [
{
"item": "irons_spellbooks:cinder_essence",
"value": 1.0
}
]
}

View File

@ -0,0 +1,56 @@
{
"translation": "Arcane Steel ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "irons_spellbooks:arcane_ingot"
},
"hardness": 6.2,
"density": 2.8,
"flexibility": 3,
"durability": 1700,
"enchantability": 26,
"toughness": 3,
"tier": 5,
"mining_speed": 9,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 34,
"armor_toughness": 2.0,
"color": "EACAFD",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "101724",
"68": "1e2c46",
"107": "3c589c",
"150": "496fc2",
"190": "e7a7fe",
"216": "eacafd",
"255": "f9e5fd"
},
"filler": "interpolate"
},
"textures": [
"metallic"
],
"properties": {
"handheld": {
"attributes": [
{
"attribute": "irons_spellbooks:spell_power",
"value": "0.05",
"operation": "*",
"slot": "mainhand"
}
]
}
},
"items": [
{
"item": "irons_spellbooks:arcane_ingot",
"value": 1.0
}
]
}

View File

@ -0,0 +1,57 @@
{
"translation": "Mithril ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "irons_spellbooks:mithril_ingot"
},
"hardness": 6.4,
"density": 1.2,
"flexibility": 4,
"durability": 1800,
"enchantability": 24,
"toughness": 3,
"tier": 5,
"mining_speed": 11,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 36,
"armor_toughness": 2.0,
"color": "BDF3F3",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "1b2a32",
"68": "335160",
"107": "496c84",
"150": "7dacaf",
"190": "99cdd9",
"216": "bdf3f3",
"255": "ffffff"
},
"filler": "interpolate"
},
"textures": [
"metallic",
"bright"
],
"properties": {
"handheld": {
"attributes": [
{
"attribute": "generic.attack_speed",
"value": "0.12",
"operation": "+",
"slot": "mainhand"
}
]
}
},
"items": [
{
"item": "irons_spellbooks:mithril_ingot",
"value": 1.0
}
]
}

View File

@ -0,0 +1,57 @@
{
"translation": "Pyrium ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "irons_spellbooks:pyrium_ingot"
},
"hardness": 6.8,
"density": 3.4,
"flexibility": 2,
"durability": 1750,
"enchantability": 18,
"toughness": 3,
"tier": 5,
"mining_speed": 9,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 36,
"armor_toughness": 2.0,
"color": "D6AF39",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "160909",
"68": "2b1111",
"107": "491b10",
"150": "9c5e2c",
"190": "b9892e",
"216": "d6af39",
"255": "ffffff"
},
"filler": "interpolate"
},
"textures": [
"emissive",
"metallic"
],
"properties": {
"default": {
"fire_proof": true,
"emissive": {
"sky": 5,
"block": 5
}
},
"handheld": {
"immolate": "2"
}
},
"items": [
{
"item": "irons_spellbooks:pyrium_ingot",
"value": 1.0
}
]
}

View File

@ -0,0 +1,6 @@
{
"pack": {
"description": "Iron's Spells Materials for Truly Modular",
"pack_format": 48
}
}

View File

@ -0,0 +1,57 @@
{
"translation": "Fluorite ",
"groups": [
"crystal",
"gem"
],
"icon": {
"type": "item",
"item": "mekanism:fluorite_gem"
},
"hardness": 5.6,
"density": 2.2,
"flexibility": 0,
"durability": 600,
"enchantability": 18,
"toughness": 1,
"tier": 4,
"mining_speed": 8,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 20,
"color": "EEFDF6",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "50555d",
"68": "9aa4b2",
"107": "9aa4b2",
"150": "c1d5de",
"190": "d7ecec",
"216": "eefdf6",
"255": "ffffff"
},
"filler": "interpolate"
},
"textures": [
"crystal",
"bright"
],
"properties": {
"default": {
"emissive": {
"sky": 4,
"block": 4
}
}
},
"items": [
{
"item": "mekanism:fluorite_gem",
"value": 1.0
},
{
"item": "mekanism:block_fluorite",
"value": 4.0
}
]
}

View File

@ -0,0 +1,57 @@
{
"translation": "Antimatter ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "mekanism:pellet_antimatter"
},
"hardness": 9.5,
"density": 2.0,
"flexibility": 3,
"durability": 4000,
"enchantability": 22,
"toughness": 5,
"tier": 7,
"mining_speed": 15,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 52,
"armor_toughness": 5.0,
"color": "FFADDE",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "291236",
"68": "4f2367",
"107": "6b367c",
"150": "904daa",
"190": "ff96e6",
"216": "ffadde",
"255": "ffadde"
},
"filler": "interpolate"
},
"textures": [
"emissive",
"metallic"
],
"properties": {
"default": {
"fire_proof": true,
"emissive": {
"sky": 12,
"block": 12
}
},
"handheld": {
"immolate": "5"
}
},
"items": [
{
"item": "mekanism:pellet_antimatter",
"value": 1.0
}
]
}

View File

@ -0,0 +1,49 @@
{
"translation": "Atomic Alloy ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "mekanism:alloy_atomic"
},
"hardness": 7.8,
"density": 3.8,
"flexibility": 3,
"durability": 2800,
"enchantability": 18,
"toughness": 4,
"tier": 6,
"mining_speed": 11,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 44,
"armor_toughness": 3.5,
"color": "BF85E2",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "201920",
"68": "3e313d",
"107": "693d6b",
"150": "863f90",
"190": "b273e0",
"216": "bf85e2",
"255": "eda5e2"
},
"filler": "interpolate"
},
"textures": [
"metallic"
],
"properties": {
"default": {
"fire_proof": true
}
},
"items": [
{
"item": "mekanism:alloy_atomic",
"value": 1.0
}
]
}

View File

@ -0,0 +1,51 @@
{
"translation": "Bronze ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "mekanism:ingot_bronze"
},
"hardness": 4.9,
"density": 4.0,
"flexibility": 1,
"durability": 420,
"enchantability": 12,
"toughness": 1,
"tier": 3,
"mining_speed": 6,
"mining_level": "minecraft:incorrect_for_iron_tool",
"armor_durability": 19,
"color": "FFE1A3",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "31231c",
"68": "5e4336",
"107": "8b553d",
"150": "c67e5a",
"190": "ffc675",
"216": "ffe1a3",
"255": "ffedc1"
},
"filler": "interpolate"
},
"textures": [
"metallic"
],
"items": [
{
"item": "mekanism:ingot_bronze",
"value": 1.0
},
{
"item": "mekanism:nugget_bronze",
"value": 0.11112
},
{
"item": "mekanism:block_bronze",
"value": 9.0
}
]
}

View File

@ -0,0 +1,63 @@
{
"translation": "HDPE ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "mekanism:hdpe_sheet"
},
"hardness": 3.2,
"density": 0.9,
"flexibility": 6,
"durability": 450,
"enchantability": 20,
"toughness": 1,
"tier": 3,
"mining_speed": 3,
"mining_level": "minecraft:incorrect_for_iron_tool",
"armor_durability": 18,
"color": "FCFCF8",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "585751",
"68": "a9a79c",
"107": "cdccc2",
"150": "dbdbcf",
"190": "f5f7eb",
"216": "fcfcf8",
"255": "ffffff"
},
"filler": "interpolate"
},
"textures": [
"rough"
],
"properties": {
"handheld": {
"attributes": [
{
"attribute": "generic.attack_speed",
"value": "0.1",
"operation": "+",
"slot": "mainhand"
}
]
}
},
"items": [
{
"item": "mekanism:hdpe_sheet",
"value": 1.0
},
{
"item": "mekanism:hdpe_pellet",
"value": 0.25
},
{
"item": "mekanism:hdpe_rod",
"value": 0.5
}
]
}

View File

@ -0,0 +1,43 @@
{
"translation": "Infused Alloy ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "mekanism:alloy_infused"
},
"hardness": 5.8,
"density": 3.6,
"flexibility": 2,
"durability": 800,
"enchantability": 16,
"toughness": 2,
"tier": 4,
"mining_speed": 8,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 26,
"color": "FFAE7E",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "321514",
"68": "602827",
"107": "a11e21",
"150": "c73833",
"190": "f7614c",
"216": "ffae7e",
"255": "ffd2b3"
},
"filler": "interpolate"
},
"textures": [
"metallic"
],
"items": [
{
"item": "mekanism:alloy_infused",
"value": 1.0
}
]
}

View File

@ -0,0 +1,64 @@
{
"translation": "Lead ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "mekanism:ingot_lead"
},
"hardness": 4.2,
"density": 6.0,
"flexibility": 0.5,
"durability": 300,
"enchantability": 8,
"toughness": 1,
"tier": 3,
"mining_speed": 4,
"mining_level": "minecraft:incorrect_for_iron_tool",
"armor_durability": 16,
"knockback_resistance": 0.05,
"color": "A2B6B4",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "242526",
"68": "454749",
"107": "5c6469",
"150": "687a76",
"190": "8aa5a1",
"216": "a2b6b4",
"255": "bbc8c5"
},
"filler": "interpolate"
},
"textures": [
"metallic"
],
"properties": {
"handheld": {
"attributes": [
{
"attribute": "generic.attack_speed",
"value": "-0.12",
"operation": "+",
"slot": "mainhand"
}
]
}
},
"items": [
{
"item": "mekanism:ingot_lead",
"value": 1.0
},
{
"item": "mekanism:nugget_lead",
"value": 0.11112
},
{
"item": "mekanism:block_lead",
"value": 9.0
}
]
}

View File

@ -0,0 +1,64 @@
{
"translation": "Osmium ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "mekanism:ingot_osmium"
},
"hardness": 5.6,
"density": 5.6,
"flexibility": 0.5,
"durability": 620,
"enchantability": 10,
"toughness": 2,
"tier": 4,
"mining_speed": 6,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 22,
"armor_toughness": 1.0,
"color": "CEE2EE",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "2b2e38",
"68": "52586c",
"107": "637278",
"150": "939caf",
"190": "b3c3ca",
"216": "cee2ee",
"255": "f9fcff"
},
"filler": "interpolate"
},
"textures": [
"metallic"
],
"properties": {
"handheld": {
"attributes": [
{
"attribute": "generic.attack_speed",
"value": "-0.08",
"operation": "+",
"slot": "mainhand"
}
]
}
},
"items": [
{
"item": "mekanism:ingot_osmium",
"value": 1.0
},
{
"item": "mekanism:nugget_osmium",
"value": 0.11112
},
{
"item": "mekanism:block_osmium",
"value": 9.0
}
]
}

View File

@ -0,0 +1,54 @@
{
"translation": "Plutonium ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "mekanism:pellet_plutonium"
},
"hardness": 6.8,
"density": 5.6,
"flexibility": 0.5,
"durability": 1500,
"enchantability": 8,
"toughness": 3,
"tier": 5,
"mining_speed": 8,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 30,
"color": "94E7E9",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "133d44",
"68": "257583",
"107": "3c8a97",
"150": "5da7b3",
"190": "66bcc4",
"216": "94e7e9",
"255": "9deff1"
},
"filler": "interpolate"
},
"textures": [
"metallic"
],
"properties": {
"default": {
"emissive": {
"sky": 5,
"block": 5
}
},
"handheld": {
"leeching": "0.7"
}
},
"items": [
{
"item": "mekanism:pellet_plutonium",
"value": 1.0
}
]
}

View File

@ -0,0 +1,54 @@
{
"translation": "Polonium ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "mekanism:pellet_polonium"
},
"hardness": 6.6,
"density": 5.0,
"flexibility": 1,
"durability": 1400,
"enchantability": 9,
"toughness": 3,
"tier": 5,
"mining_speed": 8,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 30,
"color": "88DEAB",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "173831",
"68": "2d6c5e",
"107": "2e846e",
"150": "3b9e7d",
"190": "64c395",
"216": "88deab",
"255": "aeecc5"
},
"filler": "interpolate"
},
"textures": [
"metallic"
],
"properties": {
"default": {
"emissive": {
"sky": 6,
"block": 6
}
},
"handheld": {
"leeching": "0.7"
}
},
"items": [
{
"item": "mekanism:pellet_polonium",
"value": 1.0
}
]
}

View File

@ -0,0 +1,63 @@
{
"translation": "Refined Glowstone ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "mekanism:ingot_refined_glowstone"
},
"hardness": 5.0,
"density": 2.4,
"flexibility": 4,
"durability": 700,
"enchantability": 30,
"toughness": 1,
"tier": 5,
"mining_speed": 11,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 22,
"color": "FFF9CA",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "3b2e21",
"68": "71593f",
"107": "aa7949",
"150": "f5c953",
"190": "ffeb98",
"216": "fff9ca",
"255": "fffef9"
},
"filler": "interpolate"
},
"textures": [
"emissive",
"metallic"
],
"properties": {
"default": {
"emissive": {
"sky": 15,
"block": 15
}
},
"tool": {
"luminious_learning": "1"
}
},
"items": [
{
"item": "mekanism:ingot_refined_glowstone",
"value": 1.0
},
{
"item": "mekanism:nugget_refined_glowstone",
"value": 0.11112
},
{
"item": "mekanism:block_refined_glowstone",
"value": 9.0
}
]
}

View File

@ -0,0 +1,67 @@
{
"translation": "Refined Obsidian ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "mekanism:ingot_refined_obsidian"
},
"hardness": 8.0,
"density": 4.6,
"flexibility": 2,
"durability": 2600,
"enchantability": 12,
"toughness": 4,
"tier": 6,
"mining_speed": 12,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 42,
"armor_toughness": 4.0,
"color": "9B82BD",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "19141c",
"68": "312735",
"107": "45374f",
"150": "59457b",
"190": "8066ad",
"216": "9b82bd",
"255": "c09ec0"
},
"filler": "interpolate"
},
"textures": [
"metallic"
],
"properties": {
"default": {
"fire_proof": true
},
"handheld": {
"attributes": [
{
"attribute": "generic.attack_speed",
"value": "-0.05",
"operation": "+",
"slot": "mainhand"
}
]
}
},
"items": [
{
"item": "mekanism:ingot_refined_obsidian",
"value": 1.0
},
{
"item": "mekanism:nugget_refined_obsidian",
"value": 0.11112
},
{
"item": "mekanism:block_refined_obsidian",
"value": 9.0
}
]
}

View File

@ -0,0 +1,44 @@
{
"translation": "Reinforced Alloy ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "mekanism:alloy_reinforced"
},
"hardness": 6.6,
"density": 4.0,
"flexibility": 2,
"durability": 1600,
"enchantability": 14,
"toughness": 3,
"tier": 5,
"mining_speed": 9,
"mining_level": "minecraft:incorrect_for_netherite_tool",
"armor_durability": 34,
"armor_toughness": 2.0,
"color": "B9FDFF",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "131d24",
"68": "243746",
"107": "308a96",
"150": "429fa8",
"190": "95f5f8",
"216": "b9fdff",
"255": "cafcfd"
},
"filler": "interpolate"
},
"textures": [
"metallic"
],
"items": [
{
"item": "mekanism:alloy_reinforced",
"value": 1.0
}
]
}

View File

@ -0,0 +1,52 @@
{
"translation": "Steel ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "mekanism:ingot_steel"
},
"hardness": 6.0,
"density": 4.2,
"flexibility": 1.5,
"durability": 720,
"enchantability": 9,
"toughness": 2,
"tier": 4,
"mining_speed": 7,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 26,
"armor_toughness": 1.0,
"color": "A4A19E",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "141414",
"68": "262626",
"107": "4f4f4f",
"150": "595959",
"190": "888885",
"216": "a4a19e",
"255": "c1c0be"
},
"filler": "interpolate"
},
"textures": [
"metallic"
],
"items": [
{
"item": "mekanism:ingot_steel",
"value": 1.0
},
{
"item": "mekanism:nugget_steel",
"value": 0.11112
},
{
"item": "mekanism:block_steel",
"value": 9.0
}
]
}

View File

@ -0,0 +1,52 @@
{
"translation": "Tin ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "mekanism:ingot_tin"
},
"hardness": 3.4,
"density": 2.6,
"flexibility": 2.5,
"durability": 150,
"enchantability": 16,
"toughness": 0,
"tier": 2,
"mining_speed": 5,
"mining_level": "minecraft:incorrect_for_stone_tool",
"armor_durability": 9,
"color": "F7EDE2",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "383838",
"68": "6c6c6c",
"107": "7d7d7d",
"150": "a5a3a1",
"190": "e3d9cb",
"216": "f7ede2",
"255": "ffffff"
},
"filler": "interpolate"
},
"textures": [
"metallic",
"bright"
],
"items": [
{
"item": "mekanism:ingot_tin",
"value": 1.0
},
{
"item": "mekanism:nugget_tin",
"value": 0.11112
},
{
"item": "mekanism:block_tin",
"value": 9.0
}
]
}

View File

@ -0,0 +1,70 @@
{
"translation": "Uranium ",
"groups": [
"metal"
],
"icon": {
"type": "item",
"item": "mekanism:ingot_uranium"
},
"hardness": 6.2,
"density": 5.8,
"flexibility": 0.5,
"durability": 900,
"enchantability": 6,
"toughness": 2,
"tier": 4,
"mining_speed": 6,
"mining_level": "minecraft:incorrect_for_diamond_tool",
"armor_durability": 24,
"color": "CEFCCE",
"color_palette": {
"type": "grayscale_map",
"colors": {
"24": "2c342e",
"68": "546458",
"107": "68886f",
"150": "85ba82",
"190": "a6f5a2",
"216": "cefcce",
"255": "f9fff9"
},
"filler": "interpolate"
},
"textures": [
"metallic"
],
"properties": {
"default": {
"emissive": {
"sky": 3,
"block": 3
}
},
"handheld": {
"leeching": "0.5",
"attributes": [
{
"attribute": "generic.attack_speed",
"value": "-0.06",
"operation": "+",
"slot": "mainhand"
}
]
}
},
"items": [
{
"item": "mekanism:ingot_uranium",
"value": 1.0
},
{
"item": "mekanism:nugget_uranium",
"value": 0.11112
},
{
"item": "mekanism:block_uranium",
"value": 9.0
}
]
}

View File

@ -0,0 +1,6 @@
{
"pack": {
"description": "Mekanism Materials for Truly Modular",
"pack_format": 48
}
}

264
tools/generate_materials.py Normal file
View File

@ -0,0 +1,264 @@
#!/usr/bin/env python3
"""Generate MIAPI material JSON from the source mods' own textures.
Every material's colour palette is sampled out of the item texture shipped by
the mod that adds it, so a material always looks like the thing it is made of.
python3 tools/generate_materials.py --jars ~/mods
The jar directory needs one jar per source mod (Mekanism, Create, Create: The
Air War, Create: Cosmonautics, Ice and Fire). Generated files are committed, so
this only needs re-running when a material definition or a source texture
changes.
Every item id in materials.py is checked against the jars; a typo fails the run
rather than shipping a material that silently refuses to load.
"""
import argparse
import json
import re
import sys
import zipfile
from pathlib import Path
import numpy as np
from PIL import Image
sys.path.insert(0, str(Path(__file__).parent))
from materials import EXTENSIONS, MATERIALS, PACKS # noqa: E402
NAMESPACE = "cmmodular"
PACK_FORMAT = 48 # 1.21.1
# Brightness levels of MIAPI's grayscale templates. Each gets a colour; values
# in between are interpolated by the game.
STOPS = [24, 68, 107, 150, 190, 216, 255]
# Where to sample the source texture for each stop, as a position in the
# texture's own brightness order. Tuned against MIAPI's hand-authored copper
# palette, which these reproduce to within ~2% per channel.
SAMPLE_POINTS = [0.02, 0.02, 0.20, 0.40, 0.66, 0.85, 0.98]
# The lowest stop sits below anything in the texture: item art rarely contains
# the deep shadow a full 3D model needs, and MIAPI's own palettes extrapolate
# it the same way (copper's darkest shade x0.52 is copper's darkest stop).
SHADOW_EXTENSION = 0.52
# Luminance below which a pixel is treated as outline rather than material.
OUTLINE_CUTOFF = 16
LUMA = np.array([0.2126, 0.7152, 0.0722])
class Jars:
"""Open mod jars, indexed by the asset namespaces they contain."""
def __init__(self, folder: Path):
self.zips = []
self.by_namespace = {}
for path in sorted(folder.glob("*.jar")):
zf = zipfile.ZipFile(path)
names = zf.namelist()
self.zips.append((path.name, zf, set(names)))
for name in names:
m = re.match(r"assets/([^/]+)/", name)
if m:
self.by_namespace.setdefault(m.group(1), (path.name, zf, set(names)))
def _for(self, namespace):
hit = self.by_namespace.get(namespace)
if hit is None:
raise LookupError(
f"no jar in --jars provides the '{namespace}' namespace; "
f"found: {', '.join(sorted(self.by_namespace)) or 'nothing'}"
)
return hit
def has_item(self, item_id: str) -> bool:
namespace, path = item_id.split(":", 1)
try:
_, _, names = self._for(namespace)
except LookupError:
return False
return f"assets/{namespace}/models/item/{path}.json" in names
def read_json(self, namespace, path):
_, zf, _ = self._for(namespace)
return json.loads(zf.read(f"assets/{namespace}/{path}"))
def texture_of(self, item_id: str) -> str:
"""Resolve an item id to the texture id its model draws."""
namespace, path = item_id.split(":", 1)
_, _, names = self._for(namespace)
seen = set()
model_ref = f"{namespace}:item/{path}"
while model_ref and model_ref not in seen:
seen.add(model_ref)
ns, mpath = model_ref.split(":", 1) if ":" in model_ref else ("minecraft", model_ref)
key = f"assets/{ns}/models/{mpath}.json"
if key not in names:
break
model = json.loads(self._for(ns)[1].read(key))
textures = model.get("textures", {})
for layer in ("layer0", "all", "texture", "particle"):
if layer in textures and not textures[layer].startswith("#"):
return textures[layer]
model_ref = model.get("parent")
guess = f"{namespace}:item/{path}"
if f"assets/{namespace}/textures/item/{path}.png" in names:
return guess
raise LookupError(f"could not resolve a texture for {item_id}")
def image(self, texture_id: str) -> Image.Image:
ns, path = texture_id.split(":", 1) if ":" in texture_id else ("minecraft", texture_id)
_, zf, _ = self._for(ns)
with zf.open(f"assets/{ns}/textures/{path}.png") as fh:
img = Image.open(fh).convert("RGBA")
img.load()
# Animated textures stack frames vertically; the first frame is enough.
if img.height > img.width:
img = img.crop((0, 0, img.width, img.width))
return img
def palette_from_image(img: Image.Image):
"""Build a MIAPI grayscale_map from a texture.
A stop's key is the brightness of MIAPI's grayscale template; its value is
simply what the material looks like at that point in its own shading. The
colours are therefore taken from the texture as they are, not re-lit to
match the stop number - 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 seven-stop ramp and any hue
drift between shadow and highlight survives.
"""
px = np.asarray(img, dtype=np.float32).reshape(-1, 4)
opaque = px[px[:, 3] > 128][:, :3]
if len(opaque) == 0:
raise ValueError("texture is fully transparent")
# Item art is usually drawn on a pure black outline. That outline is not a
# shade of the material, and letting it win the dark stops turns the whole
# shadow end colourless, so it is dropped - unless the material really is
# near-black, in which case there is nothing else to sample.
lit = opaque[opaque @ LUMA >= OUTLINE_CUTOFF]
if len(lit) >= len(opaque) * 0.25:
opaque = lit
ranked = opaque[np.argsort(opaque @ LUMA)]
window = max(1, len(ranked) // 12)
samples = []
for point in SAMPLE_POINTS:
centre = int(round(point * (len(ranked) - 1)))
lo = max(0, min(centre - window // 2, len(ranked) - window))
# Median over a window rather than one pixel, so a stray outline pixel
# cannot decide a whole stop.
samples.append(np.median(ranked[lo:lo + window], axis=0))
samples[0] = samples[1] * SHADOW_EXTENSION
return {str(stop): "%02x%02x%02x" % tuple(int(round(c)) for c in sample)
for stop, sample in zip(STOPS, samples)}
def build_material(spec, jars: Jars):
texture = jars.texture_of(spec["palette_from"])
palette = palette_from_image(jars.image(texture))
out = {
"translation": spec["translation"] + " ", # trailing space: "Steel Sword"
"groups": spec["groups"],
"icon": {"type": "item", "item": spec["icon"]},
}
out.update(spec["stats"])
out["color"] = palette["216"].upper()
out["color_palette"] = {
"type": "grayscale_map",
"colors": palette,
"filler": "interpolate",
}
out["textures"] = spec["textures"]
if spec["properties"]:
out["properties"] = spec["properties"]
out["items"] = spec["items"]
return out
def check_items(spec, jars: Jars, any_of_pack: bool):
"""Item ids must exist; tags are allowed to be missing at build time."""
problems = []
for entry in spec["items"]:
if "item" not in entry:
continue
if any_of_pack:
problems.append(
f"{spec['name']}: pack '{spec['pack']}' loads when any one of its "
f"mods is present, so it must use tags, not the item id {entry['item']}"
)
elif not jars.has_item(entry["item"]):
problems.append(f"{spec['name']}: no such item {entry['item']}")
if not jars.has_item(spec["icon"]):
problems.append(f"{spec['name']}: icon item {spec['icon']} does not exist")
return problems
def main():
parser = argparse.ArgumentParser(description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument("--jars", type=Path, required=True,
help="folder holding the source mods' jars")
parser.add_argument("--out", type=Path,
default=Path(__file__).parent.parent / "src/main/resources/packs",
help="where the sub-packs are written")
args = parser.parse_args()
jars = Jars(args.jars)
print(f"namespaces found: {', '.join(sorted(jars.by_namespace))}\n")
problems = []
for spec in MATERIALS:
pack = PACKS[spec["pack"]]
problems += check_items(spec, jars, pack.get("any_of", False))
if problems:
print("aborting, item ids do not check out:", file=sys.stderr)
for p in problems:
print(" " + p, file=sys.stderr)
return 1
written = 0
for pack_id, pack in PACKS.items():
root = args.out / pack_id
mcmeta = {
"pack": {
"description": f"{pack['name']} for Truly Modular",
"pack_format": PACK_FORMAT,
}
}
root.mkdir(parents=True, exist_ok=True)
(root / "pack.mcmeta").write_text(json.dumps(mcmeta, indent=2) + "\n")
for spec in MATERIALS:
material = build_material(spec, jars)
path = (args.out / spec["pack"] / "data" / NAMESPACE / "miapi" / "materials"
/ spec["group"] / f"{spec['name']}.json")
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(json.dumps(material, indent=2) + "\n")
written += 1
swatch = " ".join(material["color_palette"]["colors"][str(s)] for s in STOPS)
print(f" {spec['pack']:<13} {NAMESPACE}:{spec['group']}/{spec['name']:<28} {swatch}")
for ext in EXTENSIONS:
path = (args.out / ext["pack"] / "data" / NAMESPACE / "miapi" / "materials"
/ f"{ext['path']}.json")
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(json.dumps(ext["data"], indent=2) + "\n")
written += 1
print(f" {ext['pack']:<13} extends {ext['data']['key']}")
print(f"\n{written} files written to {args.out}")
return 0
if __name__ == "__main__":
sys.exit(main())

686
tools/materials.py Normal file
View File

@ -0,0 +1,686 @@
"""Material definitions for the Truly Modular addon.
One entry per material. `generate_materials.py` turns these into MIAPI material
JSON, pulling the colour palette out of the source mod's own item texture.
Stat calibration follows Tinkers' Construct 3 (1.20.1) in spirit, re-scaled onto
MIAPI's vanilla-derived numbers:
material hardness density durability ench tier mining
copper 4.2 3.6 200 13 2 5
iron 5.0 3.8 235 14 3 6
diamond 6.0 2.0 1546 10 4 8
netherite 7.0 2.0 2016 15 5 9
Tinkers' character mapping used below:
cobalt -> titanium light, fast, durable, unremarkable damage
steel -> steel balanced workhorse, no frills
hepatizon -> brass/bronze copper alloys, damage and enchantability
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 by request: 6 = refined obsidian, shadow
steel, refined radiance, atomic alloy; 7 = dragonsteel and antimatter.
"""
# Mining level tags, indexed by tier.
MINING_LEVEL = {
1: "minecraft:incorrect_for_wooden_tool",
2: "minecraft:incorrect_for_stone_tool",
3: "minecraft:incorrect_for_iron_tool",
4: "minecraft:incorrect_for_diamond_tool",
5: "minecraft:incorrect_for_netherite_tool",
6: "minecraft:incorrect_for_netherite_tool",
7: "minecraft:incorrect_for_netherite_tool",
}
NUGGET = 0.11112 # 1/9, matching MIAPI's own nugget values
BLOCK = 9.0
# Sub-packs. Each becomes a NeoForge built-in datapack that is only registered
# when its `mods` are present, so a material never references a missing item.
# `any_of` packs load when at least one listed mod is installed; those materials
# therefore have to source their ingredients from tags, not item ids.
PACKS = {
"mekanism": {"mods": ["mekanism"], "name": "Mekanism Materials"},
"create": {"mods": ["create"], "name": "Create Materials"},
"iceandfire": {"mods": ["iceandfire"], "name": "Ice and Fire Materials"},
"air_war": {"mods": ["create_the_air_wars"], "name": "Create: The Air War Materials"},
"cosmonautics": {"mods": ["rocketnautics"], "name": "Create: Cosmonautics Materials"},
"irons_spellbooks": {"mods": ["irons_spellbooks"], "name": "Iron's Spells Materials"},
"interstellar": {"mods": ["vsie"], "name": "Interstellar Expansion Materials"},
"aerospace": {
"mods": ["create_the_air_wars", "rocketnautics"],
"any_of": True,
"name": "Aerospace Materials",
},
}
# Attribute this mod registers itself, so a material can grant something the
# game has no attribute for. See FireImmunity.java.
FIRE_IMMUNITY = "cmmodular:fire_immunity"
def attribute(attr, value, slot, operation="+"):
return {"attribute": attr, "value": str(value), "operation": operation, "slot": slot}
def M(name, pack, group, translation, palette_from, items, tier, hardness, density,
flexibility, durability, enchantability, mining_speed, *, groups=None,
toughness=0, armor_durability=None, armor_toughness=None,
knockback_resistance=None, textures=("metallic",), properties=None,
icon=None, mining_level=None):
"""One material. `palette_from` is the item whose texture seeds the palette."""
return {
"name": name,
"pack": pack,
"group": group,
"translation": translation,
"palette_from": palette_from,
"icon": icon or palette_from,
"items": items,
"groups": list(groups) if groups else [group],
"textures": list(textures),
"properties": properties or {},
"stats": {
"hardness": hardness,
"density": density,
"flexibility": flexibility,
"durability": durability,
"enchantability": enchantability,
"toughness": toughness,
"tier": tier,
"mining_speed": mining_speed,
"mining_level": mining_level or MINING_LEVEL[tier],
**({"armor_durability": armor_durability} if armor_durability is not None else {}),
**({"armor_toughness": armor_toughness} if armor_toughness is not None else {}),
**({"knockback_resistance": knockback_resistance} if knockback_resistance is not None else {}),
},
}
def ingots(mod, ingot, nugget=None, block=None, extra=()):
out = [{"item": f"{mod}:{ingot}", "value": 1.0}]
if nugget:
out.append({"item": f"{mod}:{nugget}", "value": NUGGET})
if block:
out.append({"item": f"{mod}:{block}", "value": BLOCK})
out.extend(extra)
return out
def speed(value):
"""Attack speed tweak on held modules: positive is faster."""
return {"attributes": [{"attribute": "generic.attack_speed", "value": str(value),
"operation": "+", "slot": "mainhand"}]}
MATERIALS = [
# ------------------------------------------------------------------ Mekanism
M("tin", "mekanism", "metal", "Tin", "mekanism:ingot_tin",
ingots("mekanism", "ingot_tin", "nugget_tin", "block_tin"),
tier=2, hardness=3.4, density=2.6, flexibility=2.5, durability=150,
enchantability=16, mining_speed=5, armor_durability=9,
textures=("metallic", "bright")),
# Soft, light and cheap: the tier-2 filler metal. Tinkers has no tin, so
# this reads off real tin - low hardness, corrosion-proof, easy to work.
M("lead", "mekanism", "metal", "Lead", "mekanism:ingot_lead",
ingots("mekanism", "ingot_lead", "nugget_lead", "block_lead"),
tier=3, hardness=4.2, density=6.0, flexibility=0.5, durability=300,
enchantability=8, mining_speed=4, toughness=1, armor_durability=16,
knockback_resistance=0.05,
properties={"handheld": speed(-0.12)}),
# The heaviest thing here. Slow swing, poor enchanting, but it plants you.
M("osmium", "mekanism", "metal", "Osmium", "mekanism:ingot_osmium",
ingots("mekanism", "ingot_osmium", "nugget_osmium", "block_osmium"),
tier=4, hardness=5.6, density=5.6, flexibility=0.5, durability=620,
enchantability=10, mining_speed=6, toughness=2, armor_durability=22,
armor_toughness=1.0, properties={"handheld": speed(-0.08)}),
# Densest metal that exists. Heavy-weapon material: big density offset,
# real toughness, sluggish in hand.
M("bronze", "mekanism", "metal", "Bronze", "mekanism:ingot_bronze",
ingots("mekanism", "ingot_bronze", "nugget_bronze", "block_bronze"),
tier=3, hardness=4.9, density=4.0, flexibility=1, durability=420,
enchantability=12, mining_speed=6, toughness=1, armor_durability=19),
# Tinkers' amethyst bronze slot: a solid step past iron, nothing exotic.
M("steel", "mekanism", "metal", "Steel", "mekanism:ingot_steel",
ingots("mekanism", "ingot_steel", "nugget_steel", "block_steel"),
tier=4, hardness=6.0, density=4.2, flexibility=1.5, durability=720,
enchantability=9, mining_speed=7, toughness=2, armor_durability=26,
armor_toughness=1.0),
# Tinkers' steel almost verbatim: diamond harvest tier, balanced, boring
# in the way a workhorse should be. Poor enchantability is the cost.
M("uranium", "mekanism", "metal", "Uranium", "mekanism:ingot_uranium",
ingots("mekanism", "ingot_uranium", "nugget_uranium", "block_uranium"),
tier=4, hardness=6.2, density=5.8, flexibility=0.5, durability=900,
enchantability=6, mining_speed=6, toughness=2, armor_durability=24,
properties={"default": {"emissive": {"sky": 3, "block": 3}},
"handheld": {"leeching": "0.5", **speed(-0.06)}}),
# Dense, faintly glowing, actively bad for you - leeching stands in for
# radiation, and enchantability is the worst on the list.
M("refined_obsidian", "mekanism", "metal", "Refined Obsidian",
"mekanism:ingot_refined_obsidian",
ingots("mekanism", "ingot_refined_obsidian", "nugget_refined_obsidian",
"block_refined_obsidian"),
tier=6, hardness=8.0, density=4.6, flexibility=2, durability=2600,
enchantability=12, mining_speed=12, toughness=4, armor_durability=42,
armor_toughness=4.0,
properties={"default": {"fire_proof": True}, "handheld": speed(-0.05)}),
M("refined_glowstone", "mekanism", "metal", "Refined Glowstone",
"mekanism:ingot_refined_glowstone",
ingots("mekanism", "ingot_refined_glowstone", "nugget_refined_glowstone",
"block_refined_glowstone"),
tier=5, hardness=5.0, density=2.4, flexibility=4, durability=700,
enchantability=30, mining_speed=11, toughness=1, armor_durability=22,
textures=("emissive", "metallic"),
properties={"default": {"emissive": {"sky": 15, "block": 15}},
"tool": {"luminious_learning": "1"}}),
# Tinkers' rose gold role: fragile for its tier, best-in-slot enchanting.
M("infused_alloy", "mekanism", "metal", "Infused Alloy", "mekanism:alloy_infused",
[{"item": "mekanism:alloy_infused", "value": 1.0}],
tier=4, hardness=5.8, density=3.6, flexibility=2, durability=800,
enchantability=16, mining_speed=8, toughness=2, armor_durability=26),
M("reinforced_alloy", "mekanism", "metal", "Reinforced Alloy",
"mekanism:alloy_reinforced",
[{"item": "mekanism:alloy_reinforced", "value": 1.0}],
tier=5, hardness=6.6, density=4.0, flexibility=2, durability=1600,
enchantability=14, mining_speed=9, toughness=3, armor_durability=34,
armor_toughness=2.0),
M("atomic_alloy", "mekanism", "metal", "Atomic Alloy", "mekanism:alloy_atomic",
[{"item": "mekanism:alloy_atomic", "value": 1.0}],
tier=6, hardness=7.8, density=3.8, flexibility=3, durability=2800,
enchantability=18, mining_speed=11, toughness=4, armor_durability=44,
armor_toughness=3.5, properties={"default": {"fire_proof": True}}),
# Mekanism's alloy ladder ends here, so it tops out the tier-6 band.
M("fluorite", "mekanism", "crystal", "Fluorite", "mekanism:fluorite_gem",
[{"item": "mekanism:fluorite_gem", "value": 1.0},
{"item": "mekanism:block_fluorite", "value": 4.0}],
tier=4, hardness=5.6, density=2.2, flexibility=0, durability=600,
enchantability=18, mining_speed=8, toughness=1, armor_durability=20,
groups=("crystal", "gem"), textures=("crystal", "bright"),
properties={"default": {"emissive": {"sky": 4, "block": 4}}}),
# Real fluorite fluoresces, hence the faint glow; brittle, so no flex.
M("hdpe", "mekanism", "metal", "HDPE", "mekanism:hdpe_sheet",
[{"item": "mekanism:hdpe_sheet", "value": 1.0},
{"item": "mekanism:hdpe_pellet", "value": 0.25},
{"item": "mekanism:hdpe_rod", "value": 0.5}],
tier=3, hardness=3.2, density=0.9, flexibility=6, durability=450,
enchantability=20, mining_speed=3, toughness=1, armor_durability=18,
textures=("rough",), properties={"handheld": speed(0.1)}),
# Plastic: nearly weightless, very flexible, hopeless at cutting rock.
M("plutonium", "mekanism", "metal", "Plutonium", "mekanism:pellet_plutonium",
[{"item": "mekanism:pellet_plutonium", "value": 1.0}],
tier=5, hardness=6.8, density=5.6, flexibility=0.5, durability=1500,
enchantability=8, mining_speed=8, toughness=3, armor_durability=30,
properties={"default": {"emissive": {"sky": 5, "block": 5}},
"handheld": {"leeching": "0.7"}}),
M("polonium", "mekanism", "metal", "Polonium", "mekanism:pellet_polonium",
[{"item": "mekanism:pellet_polonium", "value": 1.0}],
tier=5, hardness=6.6, density=5.0, flexibility=1, durability=1400,
enchantability=9, mining_speed=8, toughness=3, armor_durability=30,
properties={"default": {"emissive": {"sky": 6, "block": 6}},
"handheld": {"leeching": "0.7"}}),
M("antimatter", "mekanism", "metal", "Antimatter", "mekanism:pellet_antimatter",
[{"item": "mekanism:pellet_antimatter", "value": 1.0}],
tier=7, hardness=9.5, density=2.0, flexibility=3, durability=4000,
enchantability=22, mining_speed=15, toughness=5, armor_durability=52,
armor_toughness=5.0, textures=("emissive", "metallic"),
properties={"default": {"fire_proof": True,
"emissive": {"sky": 12, "block": 12}},
"handheld": {"immolate": "5"}}),
# The single most expensive item in Mekanism, so it shares the ceiling
# with dragonsteel.
# -------------------------------------------------------------------- Create
M("zinc", "create", "metal", "Zinc", "create:zinc_ingot",
ingots("create", "zinc_ingot", "zinc_nugget", "zinc_block"),
tier=2, hardness=3.8, density=3.0, flexibility=1.5, durability=180,
enchantability=15, mining_speed=5, armor_durability=10,
textures=("metallic", "bright")),
# Brittle in reality, so it stays a tier-2 stepping stone to brass.
M("brass", "create", "metal", "Brass", "create:brass_ingot",
ingots("create", "brass_ingot", "brass_nugget", "brass_block",
extra=[{"item": "create:brass_sheet", "value": 1.0}]),
tier=3, hardness=5.0, density=3.4, flexibility=2, durability=380,
enchantability=18, mining_speed=8, toughness=1, armor_durability=18,
textures=("metallic", "bright")),
# Create's precision metal, and Tinkers' hepatizon slot: quick and
# enchantable rather than durable.
M("andesite_alloy", "create", "metal", "Andesite Alloy", "create:andesite_alloy",
[{"item": "create:andesite_alloy", "value": 1.0},
{"item": "create:andesite_alloy_block", "value": BLOCK}],
tier=2, hardness=4.4, density=4.2, flexibility=1, durability=210,
enchantability=8, mining_speed=4, toughness=1, armor_durability=12,
groups=("metal", "stone"), textures=("rough", "metallic")),
# Half rock, half metal - grouped as both so stone and metal modules take it.
M("refined_radiance", "create", "metal", "Refined Radiance", "create:refined_radiance",
[{"item": "create:refined_radiance", "value": 1.0}],
tier=6, hardness=7.4, density=2.0, flexibility=4, durability=2500,
enchantability=28, mining_speed=12, toughness=4, armor_durability=40,
armor_toughness=3.0, textures=("emissive", "metallic"),
properties={"default": {"fire_proof": True,
"emissive": {"sky": 15, "block": 15}},
"tool": {"luminious_learning": "1"},
"handheld": {"illager_bane": "1"}}),
M("shadow_steel", "create", "metal", "Shadow Steel", "create:shadow_steel",
[{"item": "create:shadow_steel", "value": 1.0}],
tier=6, hardness=8.2, density=4.8, flexibility=2, durability=2700,
enchantability=14, mining_speed=10, toughness=4, armor_durability=42,
armor_toughness=3.5,
properties={"default": {"fire_proof": True},
"handheld": {"leeching": "1"}}),
# Create's two chapter-end materials are deliberately a matched pair:
# radiance enchants and glows, shadow steel hits and drains.
# ----------------------------------------------------------------- Aerospace
# Both Air War and Cosmonautics add titanium. This is one material fed by
# tags so either mod (or both) supplies it; see the c: tag files.
M("titanium", "aerospace", "metal", "Titanium", "rocketnautics:titanium_ingot",
[{"tag": "c:ingots/titanium", "value": 1.0},
{"tag": "c:nuggets/titanium", "value": NUGGET},
{"tag": "c:plates/titanium", "value": 1.0}],
tier=4, hardness=5.8, density=1.6, flexibility=3, durability=1150,
enchantability=11, mining_speed=9, toughness=2, armor_durability=32,
armor_toughness=1.5,
properties={"default": {"fire_proof": True}, "handheld": speed(0.06)}),
# Tinkers' cobalt: light, fast, very durable, damage only average. Heat
# resistance is what separates it from steel.
M("titanium_alloy", "cosmonautics", "metal", "Titanium Alloy",
"rocketnautics:titanium_alloy",
[{"item": "rocketnautics:titanium_alloy", "value": 1.0},
{"item": "rocketnautics:titanium_alloy_nugget", "value": NUGGET},
{"item": "rocketnautics:titanium_alloy_sheet", "value": 1.0},
{"item": "rocketnautics:titanium_alloy_block", "value": BLOCK}],
tier=5, hardness=6.8, density=2.2, flexibility=3, durability=1900,
enchantability=12, mining_speed=10, toughness=3, armor_durability=36,
armor_toughness=2.0, properties={"default": {"fire_proof": True}}),
# ------------------------------------------------------- Create: The Air War
M("sulfur", "air_war", "crystal", "Sulfur", "create_the_air_wars:raw_sulfur",
[{"item": "create_the_air_wars:raw_sulfur", "value": 1.0},
{"item": "create_the_air_wars:crashedsulfur", "value": 1.0}],
tier=2, hardness=3.0, density=2.0, flexibility=1, durability=140,
enchantability=14, mining_speed=4, armor_durability=6,
groups=("crystal",), textures=("crystal", "rough"),
properties={"default": {"immolate": "2"}}),
# Barely a tool material - it is here because it burns.
M("amalgam", "air_war", "metal", "Amalgam", "create_the_air_wars:rough_amalgam",
[{"item": "create_the_air_wars:rough_amalgam", "value": 1.0},
{"item": "create_the_air_wars:crushed_amalgam", "value": 1.0}],
tier=3, hardness=4.4, density=5.5, flexibility=3, durability=320,
enchantability=21, mining_speed=7, armor_durability=15,
textures=("metallic", "shiny"),
properties={"handheld": {"leeching": "0.3", **speed(-0.08)}}),
# Mercury alloy: heavy, quick to enchant, quietly poisonous.
# -------------------------------------------------------------- Ice and Fire
M("silver", "iceandfire", "metal", "Silver", "iceandfire:silver_ingot",
ingots("iceandfire", "silver_ingot", "silver_nugget", "silver_block"),
tier=3, hardness=4.6, density=3.4, flexibility=2, durability=220,
enchantability=20, mining_speed=7, armor_durability=13,
textures=("metallic", "bright"),
properties={"handheld": {"fake_enchants": {"minecraft:smite": 2}}}),
# Folklore does the design work: soft metal, great for enchanting,
# murder on the undead.
M("dragonbone", "iceandfire", "bone", "Dragonbone", "iceandfire:dragonbone",
[{"item": "iceandfire:dragonbone", "value": 1.0},
{"item": "iceandfire:dragon_bone_block", "value": 4.0}],
tier=4, hardness=6.2, density=4.4, flexibility=3, durability=700,
enchantability=12, mining_speed=7, toughness=2, armor_durability=24,
groups=("bone",), textures=("rough",),
properties={"head": {"fracturing": "10"}}),
# Vanilla bone with the numbers pushed to diamond tier; keeps the
# fracturing quirk MIAPI gives bone.
M("witherbone", "iceandfire", "bone", "Witherbone", "iceandfire:witherbone",
[{"item": "iceandfire:witherbone", "value": 1.0},
{"item": "iceandfire:wither_shard", "value": 0.25}],
tier=3, hardness=5.8, density=4.6, flexibility=3, durability=520,
enchantability=10, mining_speed=6, toughness=1, armor_durability=20,
groups=("bone",), textures=("rough",),
properties={"head": {"fracturing": "15"}, "handheld": {"leeching": "0.5"}}),
M("hippogryph_talon", "iceandfire", "bone", "Talon", "iceandfire:hippogryph_talon",
[{"item": "iceandfire:hippogryph_talon", "value": 1.0}],
tier=3, hardness=6.6, density=2.4, flexibility=2, durability=300,
enchantability=14, mining_speed=6, armor_durability=14,
groups=("bone",), textures=("rough",),
properties={"handheld": speed(0.08)}),
# Sharp and light: high hardness, low durability, fast in hand.
M("sapphire", "iceandfire", "crystal", "Sapphire", "iceandfire:sapphire_gem",
[{"item": "iceandfire:sapphire_gem", "value": 1.0},
{"item": "iceandfire:sapphire_block", "value": BLOCK}],
tier=4, hardness=6.2, density=2.2, flexibility=0, durability=1200,
enchantability=14, mining_speed=8, toughness=2, armor_durability=30,
groups=("crystal", "gem"), textures=("crystal", "bright")),
M("pixie_dust", "iceandfire", "crystal", "Pixie Dust", "iceandfire:pixie_dust",
[{"item": "iceandfire:pixie_dust", "value": 1.0}],
tier=3, hardness=4.0, density=0.5, flexibility=6, durability=220,
enchantability=34, mining_speed=9, armor_durability=10,
groups=("crystal",), textures=("emissive", "crystal"),
properties={"default": {"emissive": {"sky": 7, "block": 7}},
"tool": {"luminious_learning": "1"}}),
# Highest enchantability in the set and almost no durability to go with
# it - the rose gold extreme.
M("dread_shard", "iceandfire", "crystal", "Dread", "iceandfire:dread_shard",
[{"item": "iceandfire:dread_shard", "value": 1.0}],
tier=5, hardness=6.4, density=3.0, flexibility=2, durability=1100,
enchantability=16, mining_speed=8, toughness=2, armor_durability=28,
groups=("crystal", "metal"), textures=("crystal", "rough"),
properties={"handheld": {"leeching": "1"}}),
M("ghost_ingot", "iceandfire", "metal", "Phantasmal", "iceandfire:ghost_ingot",
[{"item": "iceandfire:ghost_ingot", "value": 1.0}],
tier=5, hardness=6.0, density=0.6, flexibility=5, durability=1300,
enchantability=26, mining_speed=10, toughness=2, armor_durability=28,
textures=("emissive", "metallic"),
properties={"default": {"emissive": {"sky": 6, "block": 6}},
"handheld": speed(0.12)}),
# Almost no density: the fastest-swinging material here.
M("dragonsteel_fire", "iceandfire", "metal", "Fire Dragonsteel",
"iceandfire:dragonsteel_fire_ingot",
[{"item": "iceandfire:dragonsteel_fire_ingot", "value": 1.0},
{"item": "iceandfire:dragonsteel_fire_block", "value": BLOCK}],
tier=7, hardness=9.0, density=4.0, flexibility=3, durability=3600,
enchantability=18, mining_speed=13, toughness=5, armor_durability=50,
armor_toughness=5.0, textures=("emissive", "metallic"),
properties={"default": {"fire_proof": True,
"emissive": {"sky": 6, "block": 6}},
"handheld": {"immolate": "3"}}),
M("dragonsteel_ice", "iceandfire", "metal", "Ice Dragonsteel",
"iceandfire:dragonsteel_ice_ingot",
[{"item": "iceandfire:dragonsteel_ice_ingot", "value": 1.0},
{"item": "iceandfire:dragonsteel_ice_block", "value": BLOCK}],
tier=7, hardness=8.8, density=4.2, flexibility=3, durability=3600,
enchantability=18, mining_speed=13, toughness=5, armor_durability=50,
armor_toughness=5.0, textures=("metallic", "bright"),
properties={"armor": {"fake_item_tag": ["minecraft:freeze_immune_wearables"]},
"boot": {"can_walk_on_snow": True}}),
M("dragonsteel_lightning", "iceandfire", "metal", "Lightning Dragonsteel",
"iceandfire:dragonsteel_lightning_ingot",
[{"item": "iceandfire:dragonsteel_lightning_ingot", "value": 1.0},
{"item": "iceandfire:dragonsteel_lightning_block", "value": BLOCK}],
tier=7, hardness=8.8, density=3.4, flexibility=4, durability=3600,
enchantability=20, mining_speed=14, toughness=5, armor_durability=50,
armor_toughness=5.0, textures=("emissive", "metallic"),
properties={"default": {"emissive": {"sky": 8, "block": 8}},
"handheld": speed(0.15)}),
# The three dragonsteels share a stat line and differ only in behaviour,
# exactly how Ice and Fire treats them.
M("troll_leather_forest", "iceandfire", "fabric", "Forest Troll Leather",
"iceandfire:troll_leather_forest",
[{"item": "iceandfire:troll_leather_forest", "value": 1.0}],
tier=3, hardness=3.6, density=1.8, flexibility=5, durability=400,
enchantability=12, mining_speed=0, toughness=2, armor_durability=22,
groups=("fabric", "leather"), textures=("fabric",),
mining_level=MINING_LEVEL[1],
properties={"armor": {"fake_enchants": {"minecraft:projectile_protection": 2}}}),
M("troll_leather_frost", "iceandfire", "fabric", "Frost Troll Leather",
"iceandfire:troll_leather_frost",
[{"item": "iceandfire:troll_leather_frost", "value": 1.0}],
tier=3, hardness=3.6, density=1.8, flexibility=5, durability=400,
enchantability=12, mining_speed=0, toughness=2, armor_durability=22,
groups=("fabric", "leather"), textures=("fabric",),
mining_level=MINING_LEVEL[1],
properties={"armor": {"fake_enchants": {"minecraft:projectile_protection": 2},
"fake_item_tag": ["minecraft:freeze_immune_wearables"]},
"boot": {"can_walk_on_snow": True}}),
M("troll_leather_mountain", "iceandfire", "fabric", "Mountain Troll Leather",
"iceandfire:troll_leather_mountain",
[{"item": "iceandfire:troll_leather_mountain", "value": 1.0}],
tier=3, hardness=3.6, density=1.8, flexibility=5, durability=400,
enchantability=12, mining_speed=0, toughness=2, armor_durability=22,
groups=("fabric", "leather"), textures=("fabric",),
mining_level=MINING_LEVEL[1],
properties={"armor": {"fake_enchants": {"minecraft:projectile_protection": 2}}}),
# Ice and Fire's troll armour cuts projectile damage; projectile
# protection is the closest MIAPI-native equivalent.
M("stymphalian_feather", "iceandfire", "fletching", "Stymphalian",
"iceandfire:stymphalian_bird_feather",
[{"item": "iceandfire:stymphalian_bird_feather", "value": 1.0},
{"item": "iceandfire:stymphalian_feather_bundle", "value": 4.0}],
tier=3, hardness=3.4, density=0.4, flexibility=6, durability=140,
enchantability=15, mining_speed=0, armor_durability=8,
groups=("fletching", "feather"), textures=("feather",),
mining_level=MINING_LEVEL[1]),
# Metal feathers - sharper than a normal fletching, hence the hardness.
M("amphithere_feather", "iceandfire", "fletching", "Amphithere",
"iceandfire:amphithere_feather",
[{"item": "iceandfire:amphithere_feather", "value": 1.0}],
tier=3, hardness=2.6, density=0.3, flexibility=7, durability=120,
enchantability=18, mining_speed=0, armor_durability=8,
groups=("fletching", "feather"), textures=("feather",),
mining_level=MINING_LEVEL[1]),
# -------------------------------------------------- Iron's Spells 'n Spellbooks
# The two essences are gems and deliberately strong: they are worth using
# over a tier-6 metal only because of what they grant, since their raw
# numbers are no better and their durability is worse.
M("arcane_essence", "irons_spellbooks", "crystal", "Arcane",
"irons_spellbooks:arcane_essence",
[{"item": "irons_spellbooks:arcane_essence", "value": 1.0}],
tier=6, hardness=6.8, density=1.4, flexibility=5, durability=2400,
enchantability=32, mining_speed=11, toughness=3, armor_durability=38,
armor_toughness=2.5, groups=("crystal", "gem"), textures=("crystal", "bright"),
properties={
"default": {"emissive": {"sky": 6, "block": 6}},
"armor": {"attributes": [
# Per armour piece, so a full set is roughly +400 on top of the
# 100 base pool Iron's Spells gives a player.
attribute("irons_spellbooks:max_mana", 100, "armor"),
attribute("irons_spellbooks:mana_regen", 0.15, "armor", "*"),
]},
"handheld": {"attributes": [
attribute("irons_spellbooks:spell_power", 0.10, "mainhand", "*"),
attribute("irons_spellbooks:cooldown_reduction", 0.05, "mainhand", "*"),
]},
}),
M("cinder_essence", "irons_spellbooks", "crystal", "Cinder",
"irons_spellbooks:cinder_essence",
[{"item": "irons_spellbooks:cinder_essence", "value": 1.0}],
tier=6, hardness=7.4, density=2.6, flexibility=3, durability=2400,
enchantability=20, mining_speed=11, toughness=4, armor_durability=40,
armor_toughness=3.0, groups=("crystal", "gem"), textures=("emissive", "crystal"),
properties={
"default": {"fire_proof": True, "emissive": {"sky": 8, "block": 8}},
# One armour piece is enough: the handler treats anything at or above
# 1 as immune, so this is genuine immunity rather than a resistance
# that stacks up to it.
"armor": {"attributes": [
attribute(FIRE_IMMUNITY, 1, "armor"),
attribute("irons_spellbooks:fire_magic_resist", 0.20, "armor", "*"),
]},
"handheld": {
"immolate": "3",
"attributes": [attribute("irons_spellbooks:fire_spell_power", 0.20,
"mainhand", "*")],
},
}),
# The mod's three craftable metals, for completeness - ordinary materials
# that happen to sit late in its progression.
M("mithril", "irons_spellbooks", "metal", "Mithril",
"irons_spellbooks:mithril_ingot",
[{"item": "irons_spellbooks:mithril_ingot", "value": 1.0}],
tier=5, hardness=6.4, density=1.2, flexibility=4, durability=1800,
enchantability=24, mining_speed=11, toughness=3, armor_durability=36,
armor_toughness=2.0, textures=("metallic", "bright"),
properties={"handheld": speed(0.12)}),
# Light enough to swing fast and enchant well, in the Tolkien sense.
M("arcane_metal", "irons_spellbooks", "metal", "Arcane Steel",
"irons_spellbooks:arcane_ingot",
[{"item": "irons_spellbooks:arcane_ingot", "value": 1.0}],
tier=5, hardness=6.2, density=2.8, flexibility=3, durability=1700,
enchantability=26, mining_speed=9, toughness=3, armor_durability=34,
armor_toughness=2.0,
properties={"handheld": {"attributes": [
attribute("irons_spellbooks:spell_power", 0.05, "mainhand", "*")]}}),
# --------------------------------- Aeronautics: Interstellar Expansion (vsie)
# Mostly a machinery mod; these are the three items that are a material
# rather than a component. Solid E-710 is deliberately left out - it is
# rocket fuel, not something to build a tool out of.
M("microlattice", "interstellar", "metal", "Microlattice",
"vsie:metalic_microlattice",
[{"item": "vsie:metalic_microlattice", "value": 1.0}],
tier=5, hardness=5.2, density=0.3, flexibility=7, durability=1400,
enchantability=20, mining_speed=9, toughness=2, armor_durability=34,
armor_toughness=1.5, textures=("metallic", "bright"),
properties={"handheld": speed(0.18)}),
# Real metallic microlattice is 99.99% air and lighter than styrofoam.
# Lowest density and fastest swing of any metal here, which is the whole
# reason to pick it - it will never out-hit osmium.
M("silicon_carbide", "interstellar", "crystal", "Silicon Carbide",
"vsie:silicon_carbide",
[{"item": "vsie:silicon_carbide", "value": 1.0}],
tier=5, hardness=7.6, density=2.4, flexibility=0, durability=1300,
enchantability=12, mining_speed=13, toughness=3, armor_durability=34,
armor_toughness=3.0, groups=("crystal",), textures=("crystal", "rough"),
properties={"default": {"fire_proof": True}}),
# A ceramic: nearly as hard as diamond and the industrial abrasive of
# choice, hence the mining speed - but brittle, so no flex and less
# durability than its tier would suggest.
M("computronic_substrate", "interstellar", "metal", "Computronic",
"vsie:computronic_substrate",
[{"item": "vsie:computronic_substrate", "value": 1.0}],
tier=5, hardness=4.6, density=1.8, flexibility=3, durability=1100,
enchantability=28, mining_speed=9, toughness=2, armor_durability=28,
textures=("emissive", "metallic"),
properties={"default": {"emissive": {"sky": 4, "block": 4}},
"tool": {"luminious_learning": "1"}}),
# Soft and unimpressive as a weapon; it is here for enchantability.
M("pyrium", "irons_spellbooks", "metal", "Pyrium",
"irons_spellbooks:pyrium_ingot",
[{"item": "irons_spellbooks:pyrium_ingot", "value": 1.0}],
tier=5, hardness=6.8, density=3.4, flexibility=2, durability=1750,
enchantability=18, mining_speed=9, toughness=3, armor_durability=36,
armor_toughness=2.0, textures=("emissive", "metallic"),
properties={"default": {"fire_proof": True,
"emissive": {"sky": 5, "block": 5}},
"handheld": {"immolate": "2"}}),
]
# --------------------------------------------------------------------- scales
# Generated rather than written out: colours differ only in palette, which is
# read from each colour's own texture. Stats and behaviour follow the element.
DRAGON_SCALE_ELEMENTS = {
"fire": ["red", "bronze", "green", "gray"],
"ice": ["blue", "white", "sapphire", "silver"],
"lightning": ["electric", "amethyst", "copper", "black"],
}
DRAGON_SCALE_PROPERTIES = {
"fire": {"default": {"fire_proof": True},
"armor": {"fake_enchants": {"minecraft:fire_protection": 2}}},
"ice": {"armor": {"fake_item_tag": ["minecraft:freeze_immune_wearables"]},
"boot": {"can_walk_on_snow": True}},
"lightning": {"default": {"emissive": {"sky": 5, "block": 5}},
"handheld": speed(0.08)},
}
SEA_SERPENT_COLORS = ["blue", "bronze", "deepblue", "green", "purple", "red", "teal"]
DEATHWORM_COLORS = {"red": "Red", "white": "White", "yellow": "Tan"}
def _scales():
out = []
for element, colors in DRAGON_SCALE_ELEMENTS.items():
for color in colors:
out.append(M(
f"dragonscales_{color}", "iceandfire", "scute",
f"{color.replace('_', ' ').title()} Dragonscale",
f"iceandfire:dragonscales_{color}",
[{"item": f"iceandfire:dragonscales_{color}", "value": 1.0},
{"item": f"iceandfire:dragonscale_{color}", "value": BLOCK}],
tier=5, hardness=6.0, density=2.6, flexibility=4, durability=1500,
enchantability=15, mining_speed=7, toughness=4,
armor_durability=44, armor_toughness=3.5,
mining_level=MINING_LEVEL[4],
groups=("scute",), textures=("rough", "shiny"),
properties=DRAGON_SCALE_PROPERTIES[element]))
# Armour-first, like Tinkers' ancient hide: high toughness and
# armour durability, unremarkable as a cutting edge.
for color in SEA_SERPENT_COLORS:
out.append(M(
f"sea_serpent_scales_{color}", "iceandfire", "scute",
f"{color.replace('deepblue', 'deep blue').title()} Serpent Scale",
f"iceandfire:sea_serpent_scales_{color}",
[{"item": f"iceandfire:sea_serpent_scales_{color}", "value": 1.0},
{"item": f"iceandfire:sea_serpent_scale_block_{color}", "value": BLOCK}],
tier=4, hardness=5.4, density=2.4, flexibility=5, durability=950,
enchantability=16, mining_speed=6, toughness=3,
armor_durability=32, armor_toughness=2.5,
groups=("scute",), textures=("rough", "shiny"),
properties={"armor": {"fake_enchants": {"minecraft:respiration": 1}},
"boot": {"fake_enchants": {"minecraft:depth_strider": 1}}}))
for color, label in DEATHWORM_COLORS.items():
out.append(M(
f"deathworm_chitin_{color}", "iceandfire", "scute",
f"{label} Chitin", f"iceandfire:deathworm_chitin_{color}",
[{"item": f"iceandfire:deathworm_chitin_{color}", "value": 1.0}],
tier=4, hardness=5.6, density=2.2, flexibility=4, durability=880,
enchantability=13, mining_speed=6, toughness=3,
armor_durability=30, armor_toughness=2.0,
groups=("scute",), textures=("rough",),
properties={"default": {"fire_proof": True}}))
# Desert worms, so heat immunity comes with the shell.
return out
MATERIALS.extend(_scales())
# Extensions add data to a material that already exists rather than replacing it.
# Ice and Fire's amethyst is the same stone MIAPI already ships, so it just
# becomes another way to craft it.
EXTENSIONS = [
{
"pack": "iceandfire",
"path": "crystal/amethyst",
"data": {
"key": "miapi:crystal/amethyst",
"items": [{"item": "iceandfire:amethyst_gem", "value": 1.0}],
},
},
]