Make EntityLookup#get use read lock for entity maps

On Folia, this map is modified by multiple threads and iterating
it may throw errors, for example using the /kill command or any
other command that uses an entity selector.
This commit is contained in:
Spottedleaf 2023-10-09 10:02:37 -07:00
parent e331557dfc
commit ad8f4803d3

View file

@ -3781,7 +3781,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+
+ @Override
+ public <U extends Entity> void get(final EntityTypeTest<Entity, U> filter, final AbortableIterationConsumer<U> action) {
+ for (final Entity entity : this.entityById.values()) {
+ final Int2ReferenceOpenHashMap<Entity> entityCopy;
+
+ this.entityByLock.readLock();
+ try {
+ entityCopy = this.entityById.clone();
+ } finally {
+ this.entityByLock.tryUnlockRead();
+ }
+ for (final Entity entity : entityCopy.values()) {
+ final Visibility visibility = EntityLookup.getEntityStatus(entity);
+ if (!visibility.isAccessible()) {
+ continue;