58 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			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);
 | |
| 	}
 | |
| }
 |