package net.minecraft.world.ticks; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.Hash.Strategy; import java.util.List; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; import net.minecraft.world.level.ChunkPos; import org.jetbrains.annotations.Nullable; public record SavedTick(T type, BlockPos pos, int delay, TickPriority priority) { public static final Strategy> UNIQUE_TICK_HASH = new Strategy>() { public int hashCode(SavedTick savedTick) { return 31 * savedTick.pos().hashCode() + savedTick.type().hashCode(); } public boolean equals(@Nullable SavedTick first, @Nullable SavedTick second) { if (first == second) { return true; } else { return first != null && second != null ? first.type() == second.type() && first.pos().equals(second.pos()) : false; } } }; public static Codec> codec(Codec codec) { MapCodec mapCodec = RecordCodecBuilder.mapCodec( instance -> instance.group( Codec.INT.fieldOf("x").forGetter(Vec3i::getX), Codec.INT.fieldOf("y").forGetter(Vec3i::getY), Codec.INT.fieldOf("z").forGetter(Vec3i::getZ) ) .apply(instance, BlockPos::new) ); return RecordCodecBuilder.create( instance -> instance.group( codec.fieldOf("i").forGetter(SavedTick::type), mapCodec.forGetter(SavedTick::pos), Codec.INT.fieldOf("t").forGetter(SavedTick::delay), TickPriority.CODEC.fieldOf("p").forGetter(SavedTick::priority) ) .apply(instance, SavedTick::new) ); } public static List> filterTickListForChunk(List> tickList, ChunkPos chunkPos) { long l = chunkPos.toLong(); return tickList.stream().filter(savedTick -> ChunkPos.asLong(savedTick.pos()) == l).toList(); } public ScheduledTick unpack(long gameTime, long subTickOrder) { return new ScheduledTick<>(this.type, this.pos, gameTime + this.delay, this.priority, subTickOrder); } public static SavedTick probe(T type, BlockPos pos) { return new SavedTick<>(type, pos, 0, TickPriority.NORMAL); } }