name: custom-mob-spawn-egg description: Use when adding spawn eggs or fixing spawn egg visual bugs (black square, grayscale, invisible).
Custom Mob Spawn Egg Implementation Guide
Purpose: Ensure all required steps are completed when adding a spawn egg for a custom mob. Spawn eggs require multiple registration points across Fabric, NeoForge, and multi-version resource files. Missing any step causes visual bugs (grayscale, invisible texture).
Spawn Egg Implementation Checklist
When adding a spawn egg for a new custom mob, all of the following steps must be completed:
1. Item Registration (ModItems.java)
Register the spawn egg item in ModItems.java for each version.
1.21.2 (requires .setId()):
public static final RegistrySupplier<Item> MOB_NAME_SPAWN_EGG = ITEMS.register(
"mob_name_spawn_egg",
() -> new com.chronodawn.items.DeferredSpawnEggItem(
ModEntities.MOB_NAME,
0xAABBCC, // Background color
0xDDEEFF, // Spots color
new Item.Properties()
.setId(ResourceKey.create(Registries.ITEM,
ResourceLocation.fromNamespaceAndPath(ChronoDawn.MOD_ID, "mob_name_spawn_egg")))
)
);
1.21.1 / 1.20.1 (simpler, no .setId()):
public static final RegistrySupplier<Item> MOB_NAME_SPAWN_EGG = ITEMS.register(
"mob_name_spawn_egg",
() -> new com.chronodawn.items.DeferredSpawnEggItem(
ModEntities.MOB_NAME,
0xAABBCC, // Background color
0xDDEEFF, // Spots color
new Item.Properties()
)
);
2. Initialize Spawn Egg (ModItems.java)
Add the initializeSpawnEgg() call inside the initializeSpawnEggs() method:
if (MOB_NAME_SPAWN_EGG.get() instanceof com.chronodawn.items.DeferredSpawnEggItem) {
((com.chronodawn.items.DeferredSpawnEggItem) MOB_NAME_SPAWN_EGG.get()).initializeSpawnEgg();
}
3. Creative Tab Entry (ModItems.java)
Add to the populateCreativeTab() method:
if (MOB_NAME_SPAWN_EGG.isPresent()) {
output.accept(MOB_NAME_SPAWN_EGG.get());
}
4. Item Model File (CRITICAL)
Without this file, the spawn egg will be completely invisible in the inventory.
Create models/item/mob_name_spawn_egg.json in all version resource directories:
common-1.20.1/src/main/resources/assets/chronodawn/models/item/common-1.21.1/src/main/resources/assets/chronodawn/models/item/common-1.21.2/src/main/resources/assets/chronodawn/models/item/common-1.21.4/src/main/resources/assets/chronodawn/models/item/
Content (identical for all versions):
{
"parent": "item/template_spawn_egg"
}
No custom texture file is needed - Minecraft generates the spawn egg texture procedurally from the two color values.
4a. Item Definition File (1.21.4 ONLY - CRITICAL)
1.21.4 introduced a new item definition system. Without this file, spawn egg colors will not display correctly.
Create items/mob_name_spawn_egg.json in the 1.21.4 resource directory:
common-1.21.4/src/main/resources/assets/chronodawn/items/
Note: This is a separate directory from models/item/ - both files are required for 1.21.4.
Content:
{
"model": {
"type": "minecraft:model",
"model": "minecraft:item/template_spawn_egg",
"tints": [
{
"type": "minecraft:constant",
"value": 10194798
},
{
"type": "minecraft:constant",
"value": 14329120
}
]
}
}
Color Value Conversion: The tints array uses decimal values, not hex:
- First tint (index 0): Background color
- Second tint (index 1): Spots color
- Convert hex to decimal:
0x9B8B6E→10194798,0xDAA520→14329120 - JavaScript conversion:
parseInt("9B8B6E", 16)→10194798
IMPORTANT: Colors must be specified in BOTH:
- Java code (hex):
0x9B8B6E, 0xDAA520in ModItems.java - JSON file (decimal):
10194798, 14329120in items/*.json
5. NeoForge Color Handler Registration (CRITICAL)
Without this, the spawn egg will appear grayscale on NeoForge. Fabric handles this automatically via vanilla mechanisms, but NeoForge requires explicit registration.
File: neoforge-base/src/main/java/com/chronodawn/neoforge/client/ChronoDawnClientNeoForge.java
Add ModItems.MOB_NAME_SPAWN_EGG.get() to the item list in the onRegisterItemColors method:
@SubscribeEvent
public static void onRegisterItemColors(RegisterColorHandlersEvent.Item event) {
event.register(
(stack, tintIndex) -> {
if (stack.getItem() instanceof com.chronodawn.items.DeferredSpawnEggItem egg) {
int color = egg.getColor(tintIndex);
return 0xFF000000 | color;
}
return 0xFFFFFFFF;
},
// ... existing spawn eggs ...
ModItems.MOB_NAME_SPAWN_EGG.get() // <-- Add here
);
}
6. Language Files
Add entries to both en_us.json and ja_jp.json for all 3 versions:
"item.chronodawn.mob_name_spawn_egg": "Mob Name Spawn Egg"
Common Issues
| Symptom | Cause | Fix |
|---|---|---|
| Spawn egg invisible, or black square (dark purple on hover) | Missing item model JSON | Add models/item/xxx_spawn_egg.json with "parent": "item/template_spawn_egg" |
| Grayscale on NeoForge only | Missing NeoForge color handler | Add to onRegisterItemColors in ChronoDawnClientNeoForge.java |
| Correct on NeoForge, broken on Fabric | Missing initializeSpawnEgg() call | Add to initializeSpawnEggs() |
| No name displayed | Missing lang entry | Add to en_us.json / ja_jp.json |
| Not in creative tab | Missing creative tab entry | Add to populateCreativeTab() |
| Colors wrong on 1.21.4 only | Missing items/*.json with tints | Add items/xxx_spawn_egg.json with tints array (1.21.4 only) |
| Colors mismatch between versions | Hex/decimal mismatch | Ensure Java (hex) and JSON (decimal) colors match |
Why NeoForge Needs Explicit Color Registration
Minecraft spawn eggs use tintIndex (0 = background, 1 = spots) to colorize the template texture at runtime. Fabric integrates with vanilla's ColorProviderRegistry automatically through DeferredSpawnEggItem, but NeoForge uses its own event system (RegisterColorHandlersEvent.Item) which requires manual registration. The alpha channel (0xFF000000 |) must also be added explicitly on NeoForge.