diff --git a/common/src/main/java/dev/architectury/registry/level/entity/SpawnPlacementsRegistry.java b/common/src/main/java/dev/architectury/registry/level/entity/SpawnPlacementsRegistry.java new file mode 100644 index 00000000..386e9ffb --- /dev/null +++ b/common/src/main/java/dev/architectury/registry/level/entity/SpawnPlacementsRegistry.java @@ -0,0 +1,44 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021, 2022 architectury + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package dev.architectury.registry.level.entity; + +import dev.architectury.injectables.annotations.ExpectPlatform; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.SpawnPlacements; +import net.minecraft.world.level.levelgen.Heightmap; + +import java.util.function.Supplier; + +public final class SpawnPlacementsRegistry { + /** + * Registers the spawn placement of an entity. + * + * @param type the type of entity + * @param spawnPlacement the type of spawn placement + * @param heightmapType the type of heightmap + * @param spawnPredicate the spawn predicate + * @see net.minecraft.world.entity.SpawnPlacements + */ + @ExpectPlatform + public static void register(Supplier> type, SpawnPlacements.Type spawnPlacement, Heightmap.Types heightmapType, SpawnPlacements.SpawnPredicate spawnPredicate) { + throw new AssertionError(); + } +} diff --git a/fabric/src/main/java/dev/architectury/registry/level/entity/fabric/SpawnPlacementsRegistryImpl.java b/fabric/src/main/java/dev/architectury/registry/level/entity/fabric/SpawnPlacementsRegistryImpl.java new file mode 100644 index 00000000..962efd22 --- /dev/null +++ b/fabric/src/main/java/dev/architectury/registry/level/entity/fabric/SpawnPlacementsRegistryImpl.java @@ -0,0 +1,33 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021, 2022 architectury + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package dev.architectury.registry.level.entity.fabric; + +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.SpawnPlacements; +import net.minecraft.world.level.levelgen.Heightmap; + +import java.util.function.Supplier; + +public class SpawnPlacementsRegistryImpl { + public static void register(Supplier> type, SpawnPlacements.Type spawnPlacement, Heightmap.Types heightmapType, SpawnPlacements.SpawnPredicate spawnPredicate) { + SpawnPlacements.register(type.get(), spawnPlacement, heightmapType, spawnPredicate); + } +} diff --git a/forge/src/main/java/dev/architectury/registry/level/entity/forge/SpawnPlacementsRegistryImpl.java b/forge/src/main/java/dev/architectury/registry/level/entity/forge/SpawnPlacementsRegistryImpl.java new file mode 100644 index 00000000..63afd118 --- /dev/null +++ b/forge/src/main/java/dev/architectury/registry/level/entity/forge/SpawnPlacementsRegistryImpl.java @@ -0,0 +1,60 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021, 2022 architectury + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package dev.architectury.registry.level.entity.forge; + +import dev.architectury.platform.forge.EventBuses; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.SpawnPlacements; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraftforge.event.entity.SpawnPlacementRegisterEvent; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +public class SpawnPlacementsRegistryImpl { + private static List> entries = new ArrayList<>(); + + private record Entry(Supplier> type, SpawnPlacements.Type spawnPlacement, + Heightmap.Types heightmapType, + SpawnPlacements.SpawnPredicate spawnPredicate) { + } + + static { + EventBuses.onRegistered("architectury", bus -> { + bus.addListener(event -> { + for (Entry entry : entries) { + Entry casted = (Entry) entry; + event.register(casted.type().get(), casted.spawnPlacement(), casted.heightmapType(), casted.spawnPredicate(), SpawnPlacementRegisterEvent.Operation.OR); + } + entries = null; + }); + }); + } + + public static void register(Supplier> type, SpawnPlacements.Type spawnPlacement, Heightmap.Types heightmapType, SpawnPlacements.SpawnPredicate spawnPredicate) { + if (entries != null) { + entries.add(new Entry<>(type, spawnPlacement, heightmapType, spawnPredicate)); + } else { + throw new IllegalStateException("SpawnPlacementsRegistry.register must not be called after the registry has been collected!"); + } + } +}