package net.minecraft.util.random; import com.mojang.logging.LogUtils; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import java.util.function.Function; import net.minecraft.SharedConstants; import net.minecraft.Util; import net.minecraft.util.ExtraCodecs; import org.slf4j.Logger; public record Weighted(T value, int weight) { private static final Logger LOGGER = LogUtils.getLogger(); public Weighted(T value, int weight) { if (weight < 0) { throw (IllegalArgumentException)Util.pauseInIde((T)(new IllegalArgumentException("Weight should be >= 0"))); } else { if (weight == 0 && SharedConstants.IS_RUNNING_IN_IDE) { LOGGER.warn("Found 0 weight, make sure this is intentional!"); } this.value = value; this.weight = weight; } } public static Codec> codec(Codec elementCodec) { return codec(elementCodec.fieldOf("data")); } public static Codec> codec(MapCodec elementCodec) { return RecordCodecBuilder.create( instance -> instance.group(elementCodec.forGetter(Weighted::value), ExtraCodecs.NON_NEGATIVE_INT.fieldOf("weight").forGetter(Weighted::weight)) .apply(instance, Weighted::new) ); } public Weighted map(Function mapper) { return (Weighted)(new Weighted<>(mapper.apply(this.value()), this.weight)); } }