2021-06-17 06:00:32 +02:00
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2021-06-17 11:37:24 +02:00
From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
2021-06-17 06:00:32 +02: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-04-25 23:21:18 +02:00
index 56b51096ca4147363a843accf6ef2510f05e8f1a..a46bf73c608641bf1f00fd55242de71a0f2ee06e 100644
2021-06-17 06:00:32 +02:00
--- a/src/main/java/net/minecraft/world/entity/EntityType.java
+++ b/src/main/java/net/minecraft/world/entity/EntityType.java
2024-04-25 11:42:10 +02:00
@@ -649,9 +649,20 @@ public class EntityType<T extends Entity> implements FeatureElement, EntityTypeT
2022-03-01 06:43:03 +01:00
final Spliterator<? extends Tag> spliterator = entityNbtList.spliterator();
2021-06-17 06:00:32 +02:00
return StreamSupport.stream(new Spliterator<Entity>() {
2024-01-19 17:54:05 +01:00
+ final java.util.Map<EntityType<?>, Integer> loadedEntityCounts = new java.util.HashMap<>(); // Paper - Entity load/save limit per chunk
2021-06-17 06:00:32 +02:00
public boolean tryAdvance(Consumer<? super Entity> consumer) {
return spliterator.tryAdvance((nbtbase) -> {
EntityType.loadEntityRecursive((CompoundTag) nbtbase, world, (entity) -> {
2024-01-19 17:54:05 +01:00
+ // Paper start - Entity load/save limit per chunk
2021-06-17 06:00:32 +02:00
+ final EntityType<?> entityType = entity.getType();
2022-06-09 10:51:45 +02:00
+ final int saveLimit = world.paperConfig().chunks.entityPerChunkSaveLimit.getOrDefault(entityType, -1);
2021-06-17 06:00:32 +02:00
+ if (saveLimit > -1) {
+ if (this.loadedEntityCounts.getOrDefault(entityType, 0) >= saveLimit) {
+ return null;
+ }
+ this.loadedEntityCounts.merge(entityType, 1, Integer::sum);
+ }
2024-01-19 17:54:05 +01:00
+ // Paper end - Entity load/save limit per chunk
2021-06-17 06:00:32 +02: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-04-25 11:42:10 +02:00
index 9fdf8f857a5f9b231c6d0633eaba498244214f74..bee39dee1b96023c907407877aedf3aafaf5e1b8 100644
2021-06-17 06:00:32 +02: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
2024-04-25 11:42:10 +02:00
@@ -105,7 +105,18 @@ public class EntityStorage implements EntityPersistentStorage<Entity> {
2022-09-26 10:02:51 +02:00
}
2023-03-14 21:25:13 +01:00
2022-09-26 10:02:51 +02:00
ListTag listTag = new ListTag();
2024-01-19 17:54:05 +01: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 10:02:51 +02:00
entities.forEach((entity) -> { // diff here: use entities parameter
2024-01-19 17:54:05 +01:00
+ // Paper start - Entity load/save limit per chunk
2022-09-26 10:02:51 +02: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 06:00:32 +02:00
+ }
2022-09-26 10:02:51 +02:00
+ savedEntityCounts.merge(entityType, 1, Integer::sum);
+ }
2024-01-19 17:54:05 +01:00
+ // Paper end - Entity load/save limit per chunk
2022-09-26 10:02:51 +02:00
CompoundTag compoundTag = new CompoundTag();
if (entity.save(compoundTag)) {
listTag.add(compoundTag);