48 lines
2 KiB
Java
48 lines
2 KiB
Java
package net.minecraft.util.valueproviders;
|
|
|
|
import com.mojang.datafixers.util.Either;
|
|
import com.mojang.serialization.Codec;
|
|
import com.mojang.serialization.DataResult;
|
|
import net.minecraft.core.registries.BuiltInRegistries;
|
|
import net.minecraft.util.RandomSource;
|
|
|
|
public abstract class IntProvider {
|
|
private static final Codec<Either<Integer, IntProvider>> CONSTANT_OR_DISPATCH_CODEC = Codec.either(
|
|
Codec.INT, BuiltInRegistries.INT_PROVIDER_TYPE.byNameCodec().dispatch(IntProvider::getType, IntProviderType::codec)
|
|
);
|
|
public static final Codec<IntProvider> CODEC = CONSTANT_OR_DISPATCH_CODEC.xmap(
|
|
either -> either.map(ConstantInt::of, intProvider -> intProvider),
|
|
intProvider -> intProvider.getType() == IntProviderType.CONSTANT ? Either.left(((ConstantInt)intProvider).getValue()) : Either.right(intProvider)
|
|
);
|
|
public static final Codec<IntProvider> NON_NEGATIVE_CODEC = codec(0, Integer.MAX_VALUE);
|
|
public static final Codec<IntProvider> POSITIVE_CODEC = codec(1, Integer.MAX_VALUE);
|
|
|
|
/**
|
|
* Creates a codec for an IntProvider that only accepts numbers in the given range.
|
|
*/
|
|
public static Codec<IntProvider> codec(int minInclusive, int maxInclusive) {
|
|
return validateCodec(minInclusive, maxInclusive, CODEC);
|
|
}
|
|
|
|
public static <T extends IntProvider> Codec<T> validateCodec(int min, int max, Codec<T> codec) {
|
|
return codec.validate(intProvider -> validate(min, max, intProvider));
|
|
}
|
|
|
|
private static <T extends IntProvider> DataResult<T> validate(int min, int max, T provider) {
|
|
if (provider.getMinValue() < min) {
|
|
return DataResult.error(() -> "Value provider too low: " + min + " [" + provider.getMinValue() + "-" + provider.getMaxValue() + "]");
|
|
} else {
|
|
return provider.getMaxValue() > max
|
|
? DataResult.error(() -> "Value provider too high: " + max + " [" + provider.getMinValue() + "-" + provider.getMaxValue() + "]")
|
|
: DataResult.success(provider);
|
|
}
|
|
}
|
|
|
|
public abstract int sample(RandomSource random);
|
|
|
|
public abstract int getMinValue();
|
|
|
|
public abstract int getMaxValue();
|
|
|
|
public abstract IntProviderType<?> getType();
|
|
}
|