From 646f5e60026b50b1b053923c902920f9a44fdee7 Mon Sep 17 00:00:00 2001 From: Allink <44676012+allinkdev@users.noreply.github.com> Date: Mon, 4 Apr 2022 09:39:28 +0100 Subject: [PATCH] Prevent non-living entities from being spawned by spawners (#7) --- ...-entities-from-being-spawned-by-spaw.patch | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 patches/server/0023-Prevent-abusable-entities-from-being-spawned-by-spaw.patch diff --git a/patches/server/0023-Prevent-abusable-entities-from-being-spawned-by-spaw.patch b/patches/server/0023-Prevent-abusable-entities-from-being-spawned-by-spaw.patch new file mode 100644 index 0000000..b93ca69 --- /dev/null +++ b/patches/server/0023-Prevent-abusable-entities-from-being-spawned-by-spaw.patch @@ -0,0 +1,95 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Business Goose +Date: Mon, 4 Apr 2022 00:16:54 +0100 +Subject: [PATCH] Prevent abusable entities from being spawned by spawners + + +diff --git a/src/main/java/net/minecraft/world/level/BaseSpawner.java b/src/main/java/net/minecraft/world/level/BaseSpawner.java +index 569cef8fcb1e3e1e8b66dad4fa9b956b44542bf1..f844e0b1e44f0b45b1febadf02d7b37d3099fbdb 100644 +--- a/src/main/java/net/minecraft/world/level/BaseSpawner.java ++++ b/src/main/java/net/minecraft/world/level/BaseSpawner.java +@@ -19,7 +19,9 @@ import net.minecraft.util.StringUtil; + import net.minecraft.util.random.WeightedRandomList; + import net.minecraft.world.entity.Entity; + import net.minecraft.world.entity.EntityType; ++import net.minecraft.world.entity.LivingEntity; + import net.minecraft.world.entity.Mob; ++import net.minecraft.world.entity.MobCategory; + import net.minecraft.world.entity.MobSpawnType; + import net.minecraft.world.entity.SpawnGroupData; + import net.minecraft.world.entity.SpawnPlacements; +@@ -31,6 +33,7 @@ public abstract class BaseSpawner { + + private static final Logger LOGGER = LogManager.getLogger(); + private static final int EVENT_SPAWN = 1; ++ public static List whitelistedCategories = List.of(MobCategory.CREATURE, MobCategory.MONSTER, MobCategory.WATER_CREATURE, MobCategory.UNDERGROUND_WATER_CREATURE, MobCategory.AMBIENT); // Scissors + public static WeightedRandomList EMPTY_POTENTIALS = WeightedRandomList.create(); // Paper - private->public + public int spawnDelay = 20; + public WeightedRandomList spawnPotentials; +@@ -64,6 +67,13 @@ public abstract class BaseSpawner { + public ResourceLocation getEntityId(@Nullable Level world, BlockPos pos) { + String s = this.nextSpawnData.getTag().getString("id"); + ++ // Scissors start ++ Optional> entityType = EntityType.byString(s); ++ if (entityType.isPresent() && !whitelistedCategories.contains(entityType.get().getCategory())) { ++ return null; ++ } ++ // Scissors end ++ + try { + return StringUtil.isNullOrEmpty(s) ? null : new ResourceLocation(s); + } catch (ResourceLocationException resourcekeyinvalidexception) { +@@ -73,6 +83,12 @@ public abstract class BaseSpawner { + } + + public void setEntityId(EntityType type) { ++ // Scissors start - Don't allow unnatural entities to be added to spawners ++ if (!whitelistedCategories.contains(type.getCategory())) { ++ return; ++ } ++ // Scissors end ++ + this.nextSpawnData.getTag().putString("id", Registry.ENTITY_TYPE.getKey(type).toString()); + this.spawnPotentials = BaseSpawner.EMPTY_POTENTIALS; // CraftBukkit - SPIGOT-3496, MC-92282 + } +@@ -121,7 +137,7 @@ public abstract class BaseSpawner { + CompoundTag nbttagcompound = this.nextSpawnData.getTag(); + Optional> optional = EntityType.by(nbttagcompound); + +- if (!optional.isPresent()) { ++ if (!(optional.isPresent() && whitelistedCategories.contains(optional.get().getCategory()))) { // Scissors - Don't try spawning in entites that aren't whitelisted + this.delay(world, pos); + return; + } +@@ -254,12 +270,16 @@ public abstract class BaseSpawner { + ListTag nbttaglist = nbt.getList("SpawnPotentials", 10); + + for (int i = 0; i < nbttaglist.size(); ++i) { +- list.add(new SpawnData(nbttaglist.getCompound(i))); ++ // Scissors start - Filter unnatural entity types from being added ++ if (isValid(nbttaglist.getCompound(i))) { ++ list.add(new SpawnData(nbttaglist.getCompound(i))); ++ } ++ // Scissors end + } + } + + this.spawnPotentials = WeightedRandomList.create((List) list); +- if (nbt.contains("SpawnData", 10)) { ++ if (nbt.contains("SpawnData", 10) && isValid(nbt.getCompound("SpawnData"))) { // Scissors - Filter unnatural entity types from being added + this.setNextSpawnData(world, pos, new SpawnData(1, nbt.getCompound("SpawnData"))); + } else if (!list.isEmpty()) { + this.spawnPotentials.getRandom(this.random).ifPresent((mobspawnerdata) -> { +@@ -371,4 +391,11 @@ public abstract class BaseSpawner { + public double getoSpin() { + return this.oSpin; + } ++ ++ // Scissors start ++ public boolean isValid(CompoundTag tag) { ++ Optional> type = EntityType.by(tag); ++ return type.isPresent() && whitelistedCategories.contains(type.get().getCategory()); ++ } ++ // Scissors end + }