2021-06-17 04:00:32 +00:00
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2021-06-17 09:37:24 +00:00
From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
2021-06-17 04:00:32 +00:00
Date: Wed, 18 Nov 2020 20:52:25 -0800
Subject: [PATCH] Entity load/save limit per chunk
Adds a config option to limit the number of entities saved and loaded
to a chunk. The default values of -1 disable the limit. Although
defaults are only included for certain entites, this allows setting
limits for any entity type.
diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java
2024-01-19 16:54:05 +00:00
index 9d16fc698b0771bcb3c95f5fb017879c37ebb39b..2fa2e5cada590c0f44a4735bcf20de51892f428b 100644
2021-06-17 04:00:32 +00:00
--- a/src/main/java/net/minecraft/world/entity/EntityType.java
+++ b/src/main/java/net/minecraft/world/entity/EntityType.java
2023-12-06 03:34:04 +00:00
@@ -631,9 +631,20 @@ public class EntityType<T extends Entity> implements FeatureElement, EntityTypeT
2022-03-01 05:43:03 +00:00
final Spliterator<? extends Tag> spliterator = entityNbtList.spliterator();
2021-06-17 04:00:32 +00:00
return StreamSupport.stream(new Spliterator<Entity>() {
2024-01-19 16:54:05 +00:00
+ final java.util.Map<EntityType<?>, Integer> loadedEntityCounts = new java.util.HashMap<>(); // Paper - Entity load/save limit per chunk
2021-06-17 04:00:32 +00:00
public boolean tryAdvance(Consumer<? super Entity> consumer) {
return spliterator.tryAdvance((nbtbase) -> {
EntityType.loadEntityRecursive((CompoundTag) nbtbase, world, (entity) -> {
2024-01-19 16:54:05 +00:00
+ // Paper start - Entity load/save limit per chunk
2021-06-17 04:00:32 +00:00
+ final EntityType<?> entityType = entity.getType();
2022-06-09 08:51:45 +00:00
+ final int saveLimit = world.paperConfig().chunks.entityPerChunkSaveLimit.getOrDefault(entityType, -1);
2021-06-17 04:00:32 +00:00
+ if (saveLimit > -1) {
+ if (this.loadedEntityCounts.getOrDefault(entityType, 0) >= saveLimit) {
+ return null;
+ }
+ this.loadedEntityCounts.merge(entityType, 1, Integer::sum);
+ }
2024-01-19 16:54:05 +00:00
+ // Paper end - Entity load/save limit per chunk
2021-06-17 04:00:32 +00:00
consumer.accept(entity);
return entity;
});
diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java
2024-01-19 16:54:05 +00:00
index 0ec0be22f7292d57c40da6f1f4575bdebf8dbd09..23dc37ff1f92951817864963bf93220d5aae91bb 100644
2021-06-17 04:00:32 +00:00
--- a/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java
2022-09-26 08:02:51 +00:00
@@ -110,7 +110,18 @@ public class EntityStorage implements EntityPersistentStorage<Entity> {
}
2023-03-14 20:25:13 +00:00
2022-09-26 08:02:51 +00:00
ListTag listTag = new ListTag();
2024-01-19 16:54:05 +00:00
+ final java.util.Map<net.minecraft.world.entity.EntityType<?>, Integer> savedEntityCounts = new java.util.HashMap<>(); // Paper - Entity load/save limit per chunk
2022-09-26 08:02:51 +00:00
entities.forEach((entity) -> { // diff here: use entities parameter
2024-01-19 16:54:05 +00:00
+ // Paper start - Entity load/save limit per chunk
2022-09-26 08:02:51 +00:00
+ final EntityType<?> entityType = entity.getType();
+ final int saveLimit = level.paperConfig().chunks.entityPerChunkSaveLimit.getOrDefault(entityType, -1);
+ if (saveLimit > -1) {
+ if (savedEntityCounts.getOrDefault(entityType, 0) >= saveLimit) {
+ return;
2021-06-17 04:00:32 +00:00
+ }
2022-09-26 08:02:51 +00:00
+ savedEntityCounts.merge(entityType, 1, Integer::sum);
+ }
2024-01-19 16:54:05 +00:00
+ // Paper end - Entity load/save limit per chunk
2022-09-26 08:02:51 +00:00
CompoundTag compoundTag = new CompoundTag();
if (entity.save(compoundTag)) {
listTag.add(compoundTag);