minecraft-src/net/minecraft/world/level/entity/EntitySection.java
2025-07-04 01:41:11 +03:00

80 lines
2.3 KiB
Java

package net.minecraft.world.level.entity;
import com.mojang.logging.LogUtils;
import java.util.Collection;
import java.util.stream.Stream;
import net.minecraft.util.AbortableIterationConsumer;
import net.minecraft.util.ClassInstanceMultiMap;
import net.minecraft.util.VisibleForDebug;
import net.minecraft.world.phys.AABB;
import org.slf4j.Logger;
public class EntitySection<T extends EntityAccess> {
private static final Logger LOGGER = LogUtils.getLogger();
private final ClassInstanceMultiMap<T> storage;
private Visibility chunkStatus;
public EntitySection(Class<T> entityClazz, Visibility chunkStatus) {
this.chunkStatus = chunkStatus;
this.storage = new ClassInstanceMultiMap<>(entityClazz);
}
public void add(T entity) {
this.storage.add(entity);
}
public boolean remove(T entity) {
return this.storage.remove(entity);
}
public AbortableIterationConsumer.Continuation getEntities(AABB bounds, AbortableIterationConsumer<T> consumer) {
for (T entityAccess : this.storage) {
if (entityAccess.getBoundingBox().intersects(bounds) && consumer.accept(entityAccess).shouldAbort()) {
return AbortableIterationConsumer.Continuation.ABORT;
}
}
return AbortableIterationConsumer.Continuation.CONTINUE;
}
public <U extends T> AbortableIterationConsumer.Continuation getEntities(
EntityTypeTest<T, U> test, AABB bounds, AbortableIterationConsumer<? super U> consumer
) {
Collection<? extends T> collection = this.storage.find(test.getBaseClass());
if (collection.isEmpty()) {
return AbortableIterationConsumer.Continuation.CONTINUE;
} else {
for (T entityAccess : collection) {
U entityAccess2 = (U)test.tryCast(entityAccess);
if (entityAccess2 != null && entityAccess.getBoundingBox().intersects(bounds) && consumer.accept(entityAccess2).shouldAbort()) {
return AbortableIterationConsumer.Continuation.ABORT;
}
}
return AbortableIterationConsumer.Continuation.CONTINUE;
}
}
public boolean isEmpty() {
return this.storage.isEmpty();
}
public Stream<T> getEntities() {
return this.storage.stream();
}
public Visibility getStatus() {
return this.chunkStatus;
}
public Visibility updateChunkStatus(Visibility chunkStatus) {
Visibility visibility = this.chunkStatus;
this.chunkStatus = chunkStatus;
return visibility;
}
@VisibleForDebug
public int size() {
return this.storage.size();
}
}