minecraft-src/net/minecraft/client/renderer/item/properties/numeric/Time.java
2025-09-18 12:27:44 +00:00

83 lines
2.5 KiB
Java

package net.minecraft.client.renderer.item.properties.numeric;
import com.mojang.serialization.Codec;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.util.RandomSource;
import net.minecraft.util.StringRepresentable;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.item.ItemStack;
@Environment(EnvType.CLIENT)
public class Time extends NeedleDirectionHelper implements RangeSelectItemModelProperty {
public static final MapCodec<Time> MAP_CODEC = RecordCodecBuilder.mapCodec(
instance -> instance.group(
Codec.BOOL.optionalFieldOf("wobble", true).forGetter(NeedleDirectionHelper::wobble), Time.TimeSource.CODEC.fieldOf("source").forGetter(time -> time.source)
)
.apply(instance, Time::new)
);
private final Time.TimeSource source;
private final RandomSource randomSource = RandomSource.create();
private final NeedleDirectionHelper.Wobbler wobbler;
public Time(boolean wobble, Time.TimeSource source) {
super(wobble);
this.source = source;
this.wobbler = this.newWobbler(0.9F);
}
@Override
protected float calculate(ItemStack stack, ClientLevel level, int seed, Entity entity) {
float f = this.source.get(level, stack, entity, this.randomSource);
long l = level.getGameTime();
if (this.wobbler.shouldUpdate(l)) {
this.wobbler.update(l, f);
}
return this.wobbler.rotation();
}
@Override
public MapCodec<Time> type() {
return MAP_CODEC;
}
@Environment(EnvType.CLIENT)
public static enum TimeSource implements StringRepresentable {
RANDOM("random") {
@Override
public float get(ClientLevel level, ItemStack stack, Entity entity, RandomSource random) {
return random.nextFloat();
}
},
DAYTIME("daytime") {
@Override
public float get(ClientLevel level, ItemStack stack, Entity entity, RandomSource random) {
return level.getTimeOfDay(1.0F);
}
},
MOON_PHASE("moon_phase") {
@Override
public float get(ClientLevel level, ItemStack stack, Entity entity, RandomSource random) {
return level.getMoonPhase() / 8.0F;
}
};
public static final Codec<Time.TimeSource> CODEC = StringRepresentable.fromEnum(Time.TimeSource::values);
private final String name;
TimeSource(final String name) {
this.name = name;
}
@Override
public String getSerializedName() {
return this.name;
}
abstract float get(ClientLevel level, ItemStack stack, Entity entity, RandomSource random);
}
}