返回 Skill 列表
extension
分类: 开发与工程无需 API Key

custom-mob-spawn-egg

在添加生成蛋或修复生成蛋视觉错误(黑色方块、灰度、不可见)时使用。

person作者: jakexiaohubgithub

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: 0x9B8B6E10194798, 0xDAA52014329120
  • JavaScript conversion: parseInt("9B8B6E", 16)10194798

IMPORTANT: Colors must be specified in BOTH:

  1. Java code (hex): 0x9B8B6E, 0xDAA520 in ModItems.java
  2. JSON file (decimal): 10194798, 14329120 in 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.