Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-12-16 11:30:06 +01:00
bffb08c2f9
The Paper method was chosen for deprecation because it was more restrictive in that it has an isGliding check.
59 Zeilen
3.5 KiB
Diff
59 Zeilen
3.5 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
|
|
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
|
|
index 5981b2bd5745ac32cdb377c15c4384d074a47680..b1a5f160f5bd4da271f212f02c3c977a5e576b99 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/EntityType.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/EntityType.java
|
|
@@ -627,9 +627,20 @@ public class EntityType<T extends Entity> implements FeatureElement, EntityTypeT
|
|
final Spliterator<? extends Tag> spliterator = entityNbtList.spliterator();
|
|
|
|
return StreamSupport.stream(new Spliterator<Entity>() {
|
|
+ final java.util.Map<EntityType<?>, Integer> loadedEntityCounts = new java.util.HashMap<>(); // Paper
|
|
public boolean tryAdvance(Consumer<? super Entity> consumer) {
|
|
return spliterator.tryAdvance((nbtbase) -> {
|
|
EntityType.loadEntityRecursive((CompoundTag) nbtbase, world, (entity) -> {
|
|
+ // Paper start
|
|
+ final EntityType<?> entityType = entity.getType();
|
|
+ final int saveLimit = world.paperConfig().chunks.entityPerChunkSaveLimit.getOrDefault(entityType, -1);
|
|
+ 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
|
|
index 0ec0be22f7292d57c40da6f1f4575bdebf8dbd09..060e064625969610539dbf969ce773b877a7c579 100644
|
|
--- a/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java
|
|
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java
|
|
@@ -110,7 +110,18 @@ public class EntityStorage implements EntityPersistentStorage<Entity> {
|
|
}
|
|
|
|
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;
|
|
+ }
|
|
+ savedEntityCounts.merge(entityType, 1, Integer::sum);
|
|
+ }
|
|
+ // Paper end
|
|
CompoundTag compoundTag = new CompoundTag();
|
|
if (entity.save(compoundTag)) {
|
|
listTag.add(compoundTag);
|