package net.minecraft.client.resources.metadata.animation; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder.Instance; import java.util.List; import java.util.Optional; import net.minecraft.server.packs.metadata.MetadataSectionType; import net.minecraft.util.ExtraCodecs; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) public record AnimationMetadataSection( Optional> frames, Optional frameWidth, Optional frameHeight, int defaultFrameTime, boolean interpolatedFrames ) { public static final Codec CODEC = RecordCodecBuilder.create( p_376272_ -> p_376272_.group( AnimationFrame.CODEC.listOf().optionalFieldOf("frames").forGetter(AnimationMetadataSection::frames), ExtraCodecs.POSITIVE_INT.optionalFieldOf("width").forGetter(AnimationMetadataSection::frameWidth), ExtraCodecs.POSITIVE_INT.optionalFieldOf("height").forGetter(AnimationMetadataSection::frameHeight), ExtraCodecs.POSITIVE_INT.optionalFieldOf("frametime", 1).forGetter(AnimationMetadataSection::defaultFrameTime), Codec.BOOL.optionalFieldOf("interpolate", false).forGetter(AnimationMetadataSection::interpolatedFrames) ) .apply(p_376272_, AnimationMetadataSection::new) ); public static final MetadataSectionType TYPE = new MetadataSectionType<>("animation", CODEC); public FrameSize calculateFrameSize(int p_249859_, int p_250148_) { if (this.frameWidth.isPresent()) { return this.frameHeight.isPresent() ? new FrameSize(this.frameWidth.get(), this.frameHeight.get()) : new FrameSize(this.frameWidth.get(), p_250148_); } else if (this.frameHeight.isPresent()) { return new FrameSize(p_249859_, this.frameHeight.get()); } else { int i = Math.min(p_249859_, p_250148_); return new FrameSize(i, i); } } }