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-02-01 10:15:57 +01:00
index 69bdf3f2ee731e59e8d454816a9ca72cb49c0fe0..09e8445a3f8c6b3ebc852a75a9a25b41a51ba659 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-02-01 10:15:57 +01:00
@@ -640,9 +640,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-12 21:14:06 +02:00
index e8f8e1f2128df81705a88cee4b9a7760fb123750..995fbfa225efe40274c20608b9b30b8afa847698 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-12 21:14:06 +02:00
@@ -109,7 +109,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);