43 lines
1.4 KiB
Java
43 lines
1.4 KiB
Java
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>(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 <E> Codec<Weighted<E>> codec(Codec<E> elementCodec) {
|
|
return codec(elementCodec.fieldOf("data"));
|
|
}
|
|
|
|
public static <E> Codec<Weighted<E>> codec(MapCodec<E> 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 <U> Weighted<U> map(Function<T, U> mapper) {
|
|
return (Weighted<U>)(new Weighted<>(mapper.apply(this.value()), this.weight));
|
|
}
|
|
}
|