Code/net/minecraft/world/level/entity/EntityTickList.java

60 lines
1.9 KiB
Java
Raw Normal View History

2025-07-01 06:20:03 +00:00
package net.minecraft.world.level.entity;
import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap.Entry;
import java.util.function.Consumer;
import javax.annotation.Nullable;
import net.minecraft.world.entity.Entity;
public class EntityTickList {
private Int2ObjectMap<Entity> active = new Int2ObjectLinkedOpenHashMap<>();
private Int2ObjectMap<Entity> passive = new Int2ObjectLinkedOpenHashMap<>();
@Nullable
private Int2ObjectMap<Entity> iterated;
private void ensureActiveIsNotIterated() {
if (this.iterated == this.active) {
this.passive.clear();
for (Entry<Entity> entry : Int2ObjectMaps.fastIterable(this.active)) {
this.passive.put(entry.getIntKey(), entry.getValue());
}
Int2ObjectMap<Entity> int2objectmap = this.active;
this.active = this.passive;
this.passive = int2objectmap;
}
}
public void add(Entity p_156909_) {
this.ensureActiveIsNotIterated();
this.active.put(p_156909_.getId(), p_156909_);
}
public void remove(Entity p_156913_) {
this.ensureActiveIsNotIterated();
this.active.remove(p_156913_.getId());
}
public boolean contains(Entity p_156915_) {
return this.active.containsKey(p_156915_.getId());
}
public void forEach(Consumer<Entity> p_156911_) {
if (this.iterated != null) {
throw new UnsupportedOperationException("Only one concurrent iteration supported");
} else {
this.iterated = this.active;
try {
for (Entity entity : this.active.values()) {
p_156911_.accept(entity);
}
} finally {
this.iterated = null;
}
}
}
}