minecraft-src/net/minecraft/client/resources/metadata/animation/AnimationMetadataSection.java
2025-07-04 03:15:13 +03:00

40 lines
1.9 KiB
Java

package net.minecraft.client.resources.metadata.animation;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import java.util.List;
import java.util.Optional;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.server.packs.metadata.MetadataSectionType;
import net.minecraft.util.ExtraCodecs;
@Environment(EnvType.CLIENT)
public record AnimationMetadataSection(
Optional<List<AnimationFrame>> frames, Optional<Integer> frameWidth, Optional<Integer> frameHeight, int defaultFrameTime, boolean interpolatedFrames
) {
public static final Codec<AnimationMetadataSection> CODEC = RecordCodecBuilder.create(
instance -> instance.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(instance, AnimationMetadataSection::new)
);
public static final MetadataSectionType<AnimationMetadataSection> TYPE = new MetadataSectionType<>("animation", CODEC);
public FrameSize calculateFrameSize(int width, int height) {
if (this.frameWidth.isPresent()) {
return this.frameHeight.isPresent()
? new FrameSize((Integer)this.frameWidth.get(), (Integer)this.frameHeight.get())
: new FrameSize((Integer)this.frameWidth.get(), height);
} else if (this.frameHeight.isPresent()) {
return new FrameSize(width, (Integer)this.frameHeight.get());
} else {
int i = Math.min(width, height);
return new FrameSize(i, i);
}
}
}