package net.minecraft.world.ticks; import com.google.common.collect.Lists; import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.function.Function; import net.minecraft.core.BlockPos; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.world.level.ChunkPos; public class ProtoChunkTicks implements SerializableTickContainer, TickContainerAccess { private final List> ticks = Lists.>newArrayList(); private final Set> ticksPerPosition = new ObjectOpenCustomHashSet<>(SavedTick.UNIQUE_TICK_HASH); @Override public void schedule(ScheduledTick tick) { SavedTick savedTick = new SavedTick<>(tick.type(), tick.pos(), 0, tick.priority()); this.schedule(savedTick); } private void schedule(SavedTick tick) { if (this.ticksPerPosition.add(tick)) { this.ticks.add(tick); } } @Override public boolean hasScheduledTick(BlockPos pos, T type) { return this.ticksPerPosition.contains(SavedTick.probe(type, pos)); } @Override public int count() { return this.ticks.size(); } @Override public Tag save(long gameTime, Function idGetter) { ListTag listTag = new ListTag(); for (SavedTick savedTick : this.ticks) { listTag.add(savedTick.save(idGetter)); } return listTag; } public List> scheduledTicks() { return List.copyOf(this.ticks); } public static ProtoChunkTicks load(ListTag tag, Function> idParser, ChunkPos chunkPos) { ProtoChunkTicks protoChunkTicks = new ProtoChunkTicks<>(); SavedTick.loadTickList(tag, idParser, chunkPos, protoChunkTicks::schedule); return protoChunkTicks; } }