119 lines
3.2 KiB
Java
119 lines
3.2 KiB
Java
package net.minecraft.world.ticks;
|
|
|
|
import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet;
|
|
import java.util.ArrayList;
|
|
import java.util.Iterator;
|
|
import java.util.List;
|
|
import java.util.PriorityQueue;
|
|
import java.util.Queue;
|
|
import java.util.Set;
|
|
import java.util.function.BiConsumer;
|
|
import java.util.function.Predicate;
|
|
import java.util.stream.Stream;
|
|
import net.minecraft.core.BlockPos;
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
|
public class LevelChunkTicks<T> implements SerializableTickContainer<T>, TickContainerAccess<T> {
|
|
private final Queue<ScheduledTick<T>> tickQueue = new PriorityQueue(ScheduledTick.DRAIN_ORDER);
|
|
@Nullable
|
|
private List<SavedTick<T>> pendingTicks;
|
|
private final Set<ScheduledTick<?>> ticksPerPosition = new ObjectOpenCustomHashSet<>(ScheduledTick.UNIQUE_TICK_HASH);
|
|
@Nullable
|
|
private BiConsumer<LevelChunkTicks<T>, ScheduledTick<T>> onTickAdded;
|
|
|
|
public LevelChunkTicks() {
|
|
}
|
|
|
|
public LevelChunkTicks(List<SavedTick<T>> pendingTicks) {
|
|
this.pendingTicks = pendingTicks;
|
|
|
|
for (SavedTick<T> savedTick : pendingTicks) {
|
|
this.ticksPerPosition.add(ScheduledTick.probe(savedTick.type(), savedTick.pos()));
|
|
}
|
|
}
|
|
|
|
public void setOnTickAdded(@Nullable BiConsumer<LevelChunkTicks<T>, ScheduledTick<T>> onTickAdded) {
|
|
this.onTickAdded = onTickAdded;
|
|
}
|
|
|
|
@Nullable
|
|
public ScheduledTick<T> peek() {
|
|
return (ScheduledTick<T>)this.tickQueue.peek();
|
|
}
|
|
|
|
@Nullable
|
|
public ScheduledTick<T> poll() {
|
|
ScheduledTick<T> scheduledTick = (ScheduledTick<T>)this.tickQueue.poll();
|
|
if (scheduledTick != null) {
|
|
this.ticksPerPosition.remove(scheduledTick);
|
|
}
|
|
|
|
return scheduledTick;
|
|
}
|
|
|
|
@Override
|
|
public void schedule(ScheduledTick<T> tick) {
|
|
if (this.ticksPerPosition.add(tick)) {
|
|
this.scheduleUnchecked(tick);
|
|
}
|
|
}
|
|
|
|
private void scheduleUnchecked(ScheduledTick<T> tick) {
|
|
this.tickQueue.add(tick);
|
|
if (this.onTickAdded != null) {
|
|
this.onTickAdded.accept(this, tick);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean hasScheduledTick(BlockPos pos, T type) {
|
|
return this.ticksPerPosition.contains(ScheduledTick.probe(type, pos));
|
|
}
|
|
|
|
public void removeIf(Predicate<ScheduledTick<T>> predicate) {
|
|
Iterator<ScheduledTick<T>> iterator = this.tickQueue.iterator();
|
|
|
|
while (iterator.hasNext()) {
|
|
ScheduledTick<T> scheduledTick = (ScheduledTick<T>)iterator.next();
|
|
if (predicate.test(scheduledTick)) {
|
|
iterator.remove();
|
|
this.ticksPerPosition.remove(scheduledTick);
|
|
}
|
|
}
|
|
}
|
|
|
|
public Stream<ScheduledTick<T>> getAll() {
|
|
return this.tickQueue.stream();
|
|
}
|
|
|
|
@Override
|
|
public int count() {
|
|
return this.tickQueue.size() + (this.pendingTicks != null ? this.pendingTicks.size() : 0);
|
|
}
|
|
|
|
@Override
|
|
public List<SavedTick<T>> pack(long gametime) {
|
|
List<SavedTick<T>> list = new ArrayList(this.tickQueue.size());
|
|
if (this.pendingTicks != null) {
|
|
list.addAll(this.pendingTicks);
|
|
}
|
|
|
|
for (ScheduledTick<T> scheduledTick : this.tickQueue) {
|
|
list.add(scheduledTick.toSavedTick(gametime));
|
|
}
|
|
|
|
return list;
|
|
}
|
|
|
|
public void unpack(long gameTime) {
|
|
if (this.pendingTicks != null) {
|
|
int i = -this.pendingTicks.size();
|
|
|
|
for (SavedTick<T> savedTick : this.pendingTicks) {
|
|
this.scheduleUnchecked(savedTick.unpack(gameTime, i++));
|
|
}
|
|
}
|
|
|
|
this.pendingTicks = null;
|
|
}
|
|
}
|