/* * Decompiled with CFR 0.152. * * Could not load the following classes: * com.google.common.annotations.VisibleForTesting * com.mojang.datafixers.kinds.App * com.mojang.datafixers.kinds.Applicative * com.mojang.serialization.Codec * com.mojang.serialization.DataResult * com.mojang.serialization.codecs.RecordCodecBuilder */ package net.minecraft.client.resources; import com.google.common.annotations.VisibleForTesting; import com.mojang.datafixers.kinds.App; import com.mojang.datafixers.kinds.Applicative; import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; import com.mojang.serialization.codecs.RecordCodecBuilder; import java.util.List; import net.minecraft.resources.Identifier; import net.minecraft.util.ExtraCodecs; import net.minecraft.util.Mth; public record WaypointStyle(int nearDistance, int farDistance, List sprites, List spriteLocations) { @VisibleForTesting public static final String ICON_LOCATION_PREFIX = "hud/locator_bar_dot/"; public static final int DEFAULT_NEAR_DISTANCE = 128; public static final int DEFAULT_FAR_DISTANCE = 332; private static final Codec DISTANCE_CODEC = Codec.intRange((int)0, (int)60000000); public static final Codec CODEC = RecordCodecBuilder.create(i -> i.group((App)DISTANCE_CODEC.optionalFieldOf("near_distance", (Object)128).forGetter(WaypointStyle::nearDistance), (App)DISTANCE_CODEC.optionalFieldOf("far_distance", (Object)332).forGetter(WaypointStyle::farDistance), (App)ExtraCodecs.nonEmptyList(Identifier.CODEC.listOf()).fieldOf("sprites").forGetter(WaypointStyle::sprites)).apply((Applicative)i, WaypointStyle::new)).validate(WaypointStyle::validate); public WaypointStyle(int nearDistance, int farDistance, List sprites) { this(nearDistance, farDistance, sprites, sprites.stream().map(sprite -> sprite.withPrefix(ICON_LOCATION_PREFIX)).toList()); } @VisibleForTesting public DataResult validate() { if (this.sprites.isEmpty()) { return DataResult.error(() -> "Must have at least one sprite icon"); } if (this.nearDistance <= 0) { return DataResult.error(() -> "Near distance (" + this.nearDistance + ") must be greater than zero"); } if (this.nearDistance >= this.farDistance) { return DataResult.error(() -> "Far distance (" + this.farDistance + ") cannot be closer or equal to near distance (" + this.nearDistance + ")"); } return DataResult.success((Object)this); } public Identifier sprite(float distance) { if (distance < (float)this.nearDistance) { return this.spriteLocations.getFirst(); } if (distance >= (float)this.farDistance) { return this.spriteLocations.getLast(); } if (this.spriteLocations.size() == 1) { return this.spriteLocations.getFirst(); } if (this.spriteLocations.size() == 3) { return this.spriteLocations.get(1); } int index = Mth.lerpInt((distance - (float)this.nearDistance) / (float)(this.farDistance - this.nearDistance), 1, this.spriteLocations.size() - 1); return this.spriteLocations.get(index); } }