2021-06-16 21:00:32 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								--- 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 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								@@ -0,0 +0,0 @@ public class EntityType<T extends Entity> implements FeatureElement, EntityTypeT
 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-28 22:43:03 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								         final Spliterator<? extends Tag> spliterator = entityNbtList.spliterator();
							 
						 
					
						
							
								
									
										
										
										
											2021-06-16 21:00:32 -07: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-16 21:00:32 -07: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-16 21:00:32 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								+                        final EntityType<?> entityType = entity.getType();
 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-09 01:51:45 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								+                        final int saveLimit = world.paperConfig().chunks.entityPerChunkSaveLimit.getOrDefault(entityType, -1);
 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-16 21:00:32 -07: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-16 21:00:32 -07: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
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 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
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								@@ -0,0 +0,0 @@ public class EntityStorage implements EntityPersistentStorage<Entity> {
 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 01:02:51 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								         }
							 
						 
					
						
							
								
									
										
										
										
											2023-03-14 21:25:13 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 01:02:51 -07: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 01:02:51 -07: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 01:02:51 -07: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-16 21:00:32 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								+                }
 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 01:02:51 -07: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 01:02:51 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								             CompoundTag compoundTag = new CompoundTag();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								             if (entity.save(compoundTag)) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                 listTag.add(compoundTag);