minecraft-src/net/minecraft/world/ticks/SavedTick.java
2025-07-04 03:45:38 +03:00

58 lines
2.2 KiB
Java

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>(T type, BlockPos pos, int delay, TickPriority priority) {
public static final Strategy<SavedTick<?>> UNIQUE_TICK_HASH = new Strategy<SavedTick<?>>() {
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 <T> Codec<SavedTick<T>> codec(Codec<T> codec) {
MapCodec<BlockPos> 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 <T> List<SavedTick<T>> filterTickListForChunk(List<SavedTick<T>> tickList, ChunkPos chunkPos) {
long l = chunkPos.toLong();
return tickList.stream().filter(savedTick -> ChunkPos.asLong(savedTick.pos()) == l).toList();
}
public ScheduledTick<T> unpack(long gameTime, long subTickOrder) {
return new ScheduledTick<>(this.type, this.pos, gameTime + this.delay, this.priority, subTickOrder);
}
public static <T> SavedTick<T> probe(T type, BlockPos pos) {
return new SavedTick<>(type, pos, 0, TickPriority.NORMAL);
}
}