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
|
2022-12-15 14:19:09 +01:00
|
|
|
index 57bcdc06823efdb50b656e05fae6a50e92eb2217..a697c3a68e9f00f7d66dead1ec516961d9ae6e1c 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
|
2022-12-07 21:16:54 +01:00
|
|
|
@@ -618,9 +618,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>() {
|
2021-06-17 19:11:00 +02:00
|
|
|
+ final java.util.Map<EntityType<?>, Integer> loadedEntityCounts = new java.util.HashMap<>(); // Paper
|
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) -> {
|
|
|
|
+ // Paper start
|
|
|
|
+ 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);
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
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
|
2022-09-26 10:02:51 +02:00
|
|
|
index 0b92db95416b878f41b83b5c74d1c0a1031ff6af..1782d6957fa0290368e443e2e8d7b3c77ac6b8ef 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
|
2022-09-26 10:02:51 +02:00
|
|
|
@@ -110,7 +110,18 @@ public class EntityStorage implements EntityPersistentStorage<Entity> {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
ListTag listTag = new ListTag();
|
|
|
|
+ final java.util.Map<net.minecraft.world.entity.EntityType<?>, Integer> savedEntityCounts = new java.util.HashMap<>(); // Paper
|
|
|
|
entities.forEach((entity) -> { // diff here: use entities parameter
|
|
|
|
+ // Paper start
|
|
|
|
+ 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);
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
CompoundTag compoundTag = new CompoundTag();
|
|
|
|
if (entity.save(compoundTag)) {
|
|
|
|
listTag.add(compoundTag);
|