From 5e95248057437738be8c1109fa596ef2e7ad2e1b Mon Sep 17 00:00:00 2001 From: Brian Neumann-Fopiano Date: Tue, 29 Sep 2026 03:56:40 -0400 Subject: [PATCH] Overlay biome mob spawns - 26.3 custom biomes write natural_mob_spawns as an overlay modifier with its argument, matching vanilla biomes - NeoForge biome modifiers can add spawns to Iris biomes again - The 26.3 custom biome codec test checks the overlay modifier --- .../platform/bukkit/nms/v26_3_R1/CustomBiomeCodecTest.java | 3 +++ .../art/arcane/iris/pack/datapack/v263/DataFixerV263.java | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/adapters/bukkit/nms/v26_3_R1/src/test/java/art/arcane/iris/platform/bukkit/nms/v26_3_R1/CustomBiomeCodecTest.java b/adapters/bukkit/nms/v26_3_R1/src/test/java/art/arcane/iris/platform/bukkit/nms/v26_3_R1/CustomBiomeCodecTest.java index a30e593d8..637cc6abc 100644 --- a/adapters/bukkit/nms/v26_3_R1/src/test/java/art/arcane/iris/platform/bukkit/nms/v26_3_R1/CustomBiomeCodecTest.java +++ b/adapters/bukkit/nms/v26_3_R1/src/test/java/art/arcane/iris/platform/bukkit/nms/v26_3_R1/CustomBiomeCodecTest.java @@ -13,6 +13,7 @@ import net.minecraft.data.registries.VanillaRegistries; import net.minecraft.resources.RegistryOps; import net.minecraft.server.Bootstrap; import net.minecraft.world.attribute.EnvironmentAttributes; +import net.minecraft.world.attribute.modifier.MobSpawnSettingsModifier; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.MobSpawnSettings; @@ -53,5 +54,7 @@ public class CustomBiomeCodecTest { assertEquals(2, decoded.count().minInclusive()); assertEquals(4, decoded.count().maxInclusive()); assertEquals(0x102030, biome.getWaterColor() & 0xFFFFFF); + assertEquals(MobSpawnSettingsModifier.overlay(), + biome.getAttributes().get(EnvironmentAttributes.NATURAL_MOB_SPAWNS).modifier()); } } diff --git a/core/src/main/java/art/arcane/iris/pack/datapack/v263/DataFixerV263.java b/core/src/main/java/art/arcane/iris/pack/datapack/v263/DataFixerV263.java index 8c3228f12..a17f1e67d 100644 --- a/core/src/main/java/art/arcane/iris/pack/datapack/v263/DataFixerV263.java +++ b/core/src/main/java/art/arcane/iris/pack/datapack/v263/DataFixerV263.java @@ -34,9 +34,12 @@ public final class DataFixerV263 extends DataFixerV1217 { .put("max_inclusive", maximum)); } } + // Vanilla writes spawns as an overlay. A bare value decodes as an override, which NeoForge biome modifiers refuse to edit. attributes.put("minecraft:gameplay/natural_mob_spawns", new JSONObject() - .put("spawns_by_category", spawners) - .put("spawn_costs", fixed.getJSONObject("spawn_costs"))); + .put("argument", new JSONObject() + .put("spawns_by_category", spawners) + .put("spawn_costs", fixed.getJSONObject("spawn_costs"))) + .put("modifier", "overlay")); Object probability = fixed.remove("creature_spawn_probability"); if (probability != null) { attributes.put("minecraft:gameplay/creature_world_gen_spawn_probability", probability);