package net.minecraft.world.ticks; import it.unimi.dsi.fastutil.Hash.Strategy; import java.util.Comparator; import net.minecraft.core.BlockPos; import org.jetbrains.annotations.Nullable; public record ScheduledTick(T type, BlockPos pos, long triggerTick, TickPriority priority, long subTickOrder) { public static final Comparator> DRAIN_ORDER = (scheduledTick, scheduledTick2) -> { int i = Long.compare(scheduledTick.triggerTick, scheduledTick2.triggerTick); if (i != 0) { return i; } else { i = scheduledTick.priority.compareTo(scheduledTick2.priority); return i != 0 ? i : Long.compare(scheduledTick.subTickOrder, scheduledTick2.subTickOrder); } }; public static final Comparator> INTRA_TICK_DRAIN_ORDER = (scheduledTick, scheduledTick2) -> { int i = scheduledTick.priority.compareTo(scheduledTick2.priority); return i != 0 ? i : Long.compare(scheduledTick.subTickOrder, scheduledTick2.subTickOrder); }; public static final Strategy> UNIQUE_TICK_HASH = new Strategy>() { public int hashCode(ScheduledTick scheduledTick) { return 31 * scheduledTick.pos().hashCode() + scheduledTick.type().hashCode(); } public boolean equals(@Nullable ScheduledTick first, @Nullable ScheduledTick second) { if (first == second) { return true; } else { return first != null && second != null ? first.type() == second.type() && first.pos().equals(second.pos()) : false; } } }; public ScheduledTick(T type, BlockPos pos, long triggerTick, long subTickOrder) { this(type, pos, triggerTick, TickPriority.NORMAL, subTickOrder); } public ScheduledTick(T type, BlockPos pos, long triggerTick, TickPriority priority, long subTickOrder) { pos = pos.immutable(); this.type = type; this.pos = pos; this.triggerTick = triggerTick; this.priority = priority; this.subTickOrder = subTickOrder; } public static ScheduledTick probe(T type, BlockPos pos) { return new ScheduledTick<>(type, pos, 0L, TickPriority.NORMAL, 0L); } public SavedTick toSavedTick(long gametime) { return new SavedTick<>(this.type, this.pos, (int)(this.triggerTick - gametime), this.priority); } }