package net.minecraft.client.resources; import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; import com.mojang.serialization.codecs.RecordCodecBuilder; import java.util.List; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.ExtraCodecs; import net.minecraft.util.Mth; @Environment(EnvType.CLIENT) public record WaypointStyle(int nearDistance, int farDistance, List sprites, List spriteLocations) { public static final int DEFAULT_NEAR_DISTANCE = 128; public static final int DEFAULT_FAR_DISTANCE = 332; private static final Codec DISTANCE_CODEC = Codec.intRange(0, 60000000); public static final Codec CODEC = RecordCodecBuilder.create( instance -> instance.group( DISTANCE_CODEC.optionalFieldOf("near_distance", 128).forGetter(WaypointStyle::nearDistance), DISTANCE_CODEC.optionalFieldOf("far_distance", 332).forGetter(WaypointStyle::farDistance), ExtraCodecs.nonEmptyList(ResourceLocation.CODEC.listOf()).fieldOf("sprites").forGetter(WaypointStyle::sprites) ) .apply(instance, WaypointStyle::new) ) .validate(WaypointStyle::validate); public WaypointStyle(int nearDistance, int farDistance, List sprites) { this(nearDistance, farDistance, sprites, sprites.stream().map(resourceLocation -> resourceLocation.withPrefix("hud/locator_bar_dot/")).toList()); } private DataResult validate() { return this.nearDistance >= this.farDistance ? DataResult.error(() -> "Far distance (" + this.farDistance + ") cannot be closer or equal to near distance (" + this.nearDistance + ")") : DataResult.success(this); } public ResourceLocation sprite(float distance) { if (distance <= this.nearDistance) { return (ResourceLocation)this.spriteLocations.getFirst(); } else if (distance >= this.farDistance) { return (ResourceLocation)this.spriteLocations.getLast(); } else { int i = Mth.lerpInt((distance - this.nearDistance) / (this.farDistance - this.nearDistance), 0, this.spriteLocations.size()); return (ResourceLocation)this.spriteLocations.get(i); } } }