minecraft-src/net/minecraft/client/resources/WaypointStyle.java
2025-09-18 12:27:44 +00:00

48 lines
2.2 KiB
Java

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<ResourceLocation> sprites, List<ResourceLocation> spriteLocations) {
public static final int DEFAULT_NEAR_DISTANCE = 128;
public static final int DEFAULT_FAR_DISTANCE = 332;
private static final Codec<Integer> DISTANCE_CODEC = Codec.intRange(0, 60000000);
public static final Codec<WaypointStyle> CODEC = RecordCodecBuilder.<WaypointStyle>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<ResourceLocation> sprites) {
this(nearDistance, farDistance, sprites, sprites.stream().map(resourceLocation -> resourceLocation.withPrefix("hud/locator_bar_dot/")).toList());
}
private DataResult<WaypointStyle> 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);
}
}
}