Skip to content

Commit

Permalink
SpawnPlacementRegisterEvent -> RegisterSpawnPlacementsEvent
Browse files Browse the repository at this point in the history
  • Loading branch information
Spinoscythe committed Jun 20, 2024
1 parent b3f5a5b commit 5b72265
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 22 deletions.
21 changes: 11 additions & 10 deletions patches/net/minecraft/world/entity/SpawnPlacements.java.patch
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
--- a/net/minecraft/world/entity/SpawnPlacements.java
+++ b/net/minecraft/world/entity/SpawnPlacements.java
@@ -47,6 +_,7 @@
@@ -46,6 +_,10 @@
public class SpawnPlacements {
private static final Map<EntityType<?>, SpawnPlacements.Data> DATA_BY_TYPE = Maps.newHashMap();

+ /**
+ * @deprecated modders should use {@link net.neoforged.neoforge.event.entity.RegisterSpawnPlacementsEvent} instead.
+ */
+ @Deprecated
private static <T extends Mob> void register(
+ @Deprecated // FORGE: use SpawnPlacementRegisterEvent to register and modify spawn placements
EntityType<T> p_21755_, SpawnPlacementType p_321847_, Heightmap.Types p_21757_, SpawnPlacements.SpawnPredicate<T> p_21758_
) {
SpawnPlacements.Data spawnplacements$data = DATA_BY_TYPE.put(p_21755_, new SpawnPlacements.Data(p_21757_, p_321847_, p_21758_));
@@ -73,7 +_,8 @@
EntityType<T> p_217075_, ServerLevelAccessor p_217076_, MobSpawnType p_217077_, BlockPos p_217078_, RandomSource p_217079_
) {
Expand All @@ -18,18 +21,16 @@
}

static {
@@ -168,5 +_,14 @@
@@ -168,5 +_,12 @@
@FunctionalInterface
public interface SpawnPredicate<T extends Entity> {
boolean test(EntityType<T> p_217081_, ServerLevelAccessor p_217082_, MobSpawnType p_217083_, BlockPos p_217084_, RandomSource p_217085_);
+ }
+
+ // ******* FORGE START. INTERNAL USE ONLY! ****** //
+ public static void fireSpawnPlacementEvent()
+ {
+ Map<EntityType<?>, net.neoforged.neoforge.event.entity.SpawnPlacementRegisterEvent.MergedSpawnPredicate<?>> map = Maps.newHashMap();
+ DATA_BY_TYPE.forEach((type, data) -> map.put(type, new net.neoforged.neoforge.event.entity.SpawnPlacementRegisterEvent.MergedSpawnPredicate<>(data.predicate, data.placement, data.heightMap)));
+ net.neoforged.fml.ModLoader.postEvent(new net.neoforged.neoforge.event.entity.SpawnPlacementRegisterEvent(map));
+ public static void fireSpawnPlacementEvent() {
+ Map<EntityType<?>, net.neoforged.neoforge.event.entity.RegisterSpawnPlacementsEvent.MergedSpawnPredicate<?>> map = Maps.newHashMap();
+ DATA_BY_TYPE.forEach((type, data) -> map.put(type, new net.neoforged.neoforge.event.entity.RegisterSpawnPlacementsEvent.MergedSpawnPredicate<>(data.predicate, data.placement, data.heightMap)));
+ net.neoforged.fml.ModLoader.postEvent(new net.neoforged.neoforge.event.entity.RegisterSpawnPlacementsEvent(map));
+ map.forEach(((entityType, merged) -> DATA_BY_TYPE.put(entityType, new SpawnPlacements.Data(merged.getHeightmapType(), merged.getSpawnType(), merged.build()))));
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) Forge Development LLC and contributors
* Copyright (c) NeoForged and contributors
* SPDX-License-Identifier: LGPL-2.1-only
*/

Expand All @@ -25,7 +25,7 @@
* This event allows each {@link EntityType} to have a {@link SpawnPlacements.SpawnPredicate} registered or modified.
* Spawn Predicates are checked whenever an {@link Entity} of the given {@link EntityType} spawns in the world naturally.
*
* If registering your own entity's spawn placements, you should use {@link SpawnPlacementRegisterEvent#register(EntityType, SpawnPlacementType, Heightmap.Types, SpawnPlacements.SpawnPredicate, Operation)}
* If registering your own entity's spawn placements, you should use {@link RegisterSpawnPlacementsEvent#register(EntityType, SpawnPlacementType, Heightmap.Types, SpawnPlacements.SpawnPredicate, Operation)}
* So that you ensure that your entity has a heightmap type and placement type registered.
*
* If modifying vanilla or another mod's spawn placements, you can use three operations:
Expand All @@ -39,11 +39,11 @@
*
* Fired on the Mod bus {@link IModBusEvent}.<br>
*/
public class SpawnPlacementRegisterEvent extends Event implements IModBusEvent {
public class RegisterSpawnPlacementsEvent extends Event implements IModBusEvent {
private final Map<EntityType<?>, MergedSpawnPredicate<?>> map;

@ApiStatus.Internal
public SpawnPlacementRegisterEvent(Map<EntityType<?>, MergedSpawnPredicate<?>> map) {
public RegisterSpawnPlacementsEvent(Map<EntityType<?>, MergedSpawnPredicate<?>> map) {
this.map = map;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import net.neoforged.fml.LogicalSide;
import net.neoforged.neoforge.event.entity.EntityEvent;
import net.neoforged.neoforge.event.entity.EntityJoinLevelEvent;
import net.neoforged.neoforge.event.entity.SpawnPlacementRegisterEvent;
import net.neoforged.neoforge.event.entity.RegisterSpawnPlacementsEvent;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;

Expand Down Expand Up @@ -93,8 +93,8 @@ public double getZ() {
* <p>
* This event is not fired for mob spawners which utilize {@link CustomSpawnRules}, as they do not check spawn placements.
*
* @apiNote If your modifications are for a single entity, and do not vary at runtime, use {@link SpawnPlacementRegisterEvent}.
* @see SpawnPlacementRegisterEvent
* @apiNote If your modifications are for a single entity, and do not vary at runtime, use {@link RegisterSpawnPlacementsEvent}.
* @see RegisterSpawnPlacementsEvent
*/
public static class SpawnPlacementCheck extends Event {
private final EntityType<?> entityType;
Expand Down Expand Up @@ -230,7 +230,7 @@ public static enum Result {
* This event is only fired on the {@linkplain LogicalSide#SERVER logical server}.
*
* @apiNote This event fires after Spawn Placement checks, which are the primary set of spawn checks.
* @see {@link SpawnPlacementRegisterEvent} To modify spawn placements statically at startup.
* @see {@link RegisterSpawnPlacementsEvent} To modify spawn placements statically at startup.
* @see {@link SpawnPlacementCheck} To modify the result of spawn placements at runtime.
*/
public static class PositionCheck extends MobSpawnEvent {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import net.minecraft.world.level.biome.Biomes;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.event.entity.SpawnPlacementRegisterEvent;
import net.neoforged.neoforge.event.entity.RegisterSpawnPlacementsEvent;
import org.slf4j.Logger;

@Mod("spawn_placement_test")
Expand All @@ -27,12 +27,12 @@ public SpawnPlacementTest(IEventBus modEventBus) {
}
}

private void onSpawnPlacementRegister(SpawnPlacementRegisterEvent event) {
private void onSpawnPlacementRegister(RegisterSpawnPlacementsEvent event) {
LOGGER.info("Modifying spawn placements!");
// AND: require zombies to spawn below y 40
event.register(EntityType.ZOMBIE, ((entityType, level, spawnType, pos, random) -> pos.getY() < 40 && validMonsterSpawn(level, pos, entityType)), SpawnPlacementRegisterEvent.Operation.AND);
event.register(EntityType.ZOMBIE, ((entityType, level, spawnType, pos, random) -> pos.getY() < 40 && validMonsterSpawn(level, pos, entityType)), RegisterSpawnPlacementsEvent.Operation.AND);
// REPLACE: don't require darkness to spawn creepers
event.register(EntityType.CREEPER, ((entityType, level, spawnType, pos, random) -> validMonsterSpawn(level, pos, entityType)), SpawnPlacementRegisterEvent.Operation.REPLACE);
event.register(EntityType.CREEPER, ((entityType, level, spawnType, pos, random) -> validMonsterSpawn(level, pos, entityType)), RegisterSpawnPlacementsEvent.Operation.REPLACE);
// OR: allow slimes to spawn in plains
event.register(EntityType.SLIME, (entityType, level, spawnType, pos, random) -> validMonsterSpawn(level, pos, entityType) && level.getBiome(pos).is(Biomes.PLAINS));
}
Expand Down

0 comments on commit 5b72265

Please sign in to comment.