LocalTime.java

net.minecraft.client.renderer.item.properties.select.LocalTime

信息

  • 全限定名:net.minecraft.client.renderer.item.properties.select.LocalTime
  • 类型:public class
  • 包:net.minecraft.client.renderer.item.properties.select
  • 源码路径:src/main/java/net/minecraft/client/renderer/item/properties/select/LocalTime.java
  • 起始行号:L25
  • 实现:SelectItemModelProperty
  • 职责:

    TODO

字段/常量

  • ROOT_LOCALE

    • 类型: String
    • 修饰符: public static final
    • 源码定位: L26
    • 说明:

      TODO

  • UPDATE_INTERVAL_MS

    • 类型: long
    • 修饰符: private static final
    • 源码定位: L27
    • 说明:

      TODO

  • VALUE_CODEC

    • 类型: Codec<String>
    • 修饰符: public static final
    • 源码定位: L28
    • 说明:

      TODO

  • TIME_ZONE_CODEC

    • 类型: Codec<TimeZone>
    • 修饰符: private static final
    • 源码定位: L29
    • 说明:

      TODO

  • DATA_MAP_CODEC

    • 类型: MapCodec<LocalTime.Data>
    • 修饰符: private static final
    • 源码定位: L33
    • 说明:

      TODO

  • TYPE

    • 类型: SelectItemModelProperty.Type<LocalTime,String>
    • 修饰符: public static final
    • 源码定位: L41
    • 说明:

      TODO

  • data

    • 类型: LocalTime.Data
    • 修饰符: private final
    • 源码定位: L44
    • 说明:

      TODO

  • parsedFormat

    • 类型: DateFormat
    • 修饰符: private final
    • 源码定位: L45
    • 说明:

      TODO

  • nextUpdateTimeMs

    • 类型: long
    • 修饰符: private
    • 源码定位: L46
    • 说明:

      TODO

  • lastResult

    • 类型: String
    • 修饰符: private
    • 源码定位: L47
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.client.renderer.item.properties.select.LocalTime.Data
    • 类型: record
    • 修饰符: private
    • 源码定位: L98
    • 说明:

      TODO

构造器

private LocalTime(LocalTime.Data data, DateFormat parsedFormat) @ L49

  • 构造器名:LocalTime
  • 源码定位:L49
  • 修饰符:private

参数:

  • data: LocalTime.Data
  • parsedFormat: DateFormat

说明:

TODO

方法

下面的方法块按源码顺序生成。

public static LocalTime create(String format, String localeId, Optional<TimeZone> timeZone) @ L54

  • 方法名:create
  • 源码定位:L54
  • 返回类型:LocalTime
  • 修饰符:public static

参数:

  • format: String
  • localeId: String
  • timeZone: Optional

说明:

TODO

private static DataResult<LocalTime> create(LocalTime.Data data) @ L58

  • 方法名:create
  • 源码定位:L58
  • 返回类型:DataResult
  • 修饰符:private static

参数:

  • data: LocalTime.Data

说明:

TODO

public String get(ItemStack itemStack, ClientLevel level, LivingEntity owner, int seed, ItemDisplayContext displayContext) @ L73

  • 方法名:get
  • 源码定位:L73
  • 返回类型:String
  • 修饰符:public

参数:

  • itemStack: ItemStack
  • level: ClientLevel
  • owner: LivingEntity
  • seed: int
  • displayContext: ItemDisplayContext

说明:

TODO

private String update() @ L83

  • 方法名:update
  • 源码定位:L83
  • 返回类型:String
  • 修饰符:private

参数:

说明:

TODO

public SelectItemModelProperty.Type<LocalTime,String> type() @ L87

  • 方法名:type
  • 源码定位:L87
  • 返回类型:SelectItemModelProperty.Type<LocalTime,String>
  • 修饰符:public

参数:

说明:

TODO

public Codec<String> valueCodec() @ L92

  • 方法名:valueCodec
  • 源码定位:L92
  • 返回类型:Codec
  • 修饰符:public

参数:

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class LocalTime implements SelectItemModelProperty<String> {
    public static final String ROOT_LOCALE = "";
    private static final long UPDATE_INTERVAL_MS = TimeUnit.SECONDS.toMillis(1L);
    public static final Codec<String> VALUE_CODEC = Codec.STRING;
    private static final Codec<TimeZone> TIME_ZONE_CODEC = VALUE_CODEC.comapFlatMap(s -> {
        TimeZone tz = TimeZone.getTimeZone(s);
        return tz.equals(TimeZone.UNKNOWN_ZONE) ? DataResult.error(() -> "Unknown timezone: " + s) : DataResult.success(tz);
    }, TimeZone::getID);
    private static final MapCodec<LocalTime.Data> DATA_MAP_CODEC = RecordCodecBuilder.mapCodec(
        i -> i.group(
                Codec.STRING.fieldOf("pattern").forGetter(o -> o.format),
                Codec.STRING.optionalFieldOf("locale", "").forGetter(o -> o.localeId),
                TIME_ZONE_CODEC.optionalFieldOf("time_zone").forGetter(o -> o.timeZone)
            )
            .apply(i, LocalTime.Data::new)
    );
    public static final SelectItemModelProperty.Type<LocalTime, String> TYPE = SelectItemModelProperty.Type.create(
        DATA_MAP_CODEC.flatXmap(LocalTime::create, d -> DataResult.success(d.data)), VALUE_CODEC
    );
    private final LocalTime.Data data;
    private final DateFormat parsedFormat;
    private long nextUpdateTimeMs;
    private String lastResult = "";
 
    private LocalTime(LocalTime.Data data, DateFormat parsedFormat) {
        this.data = data;
        this.parsedFormat = parsedFormat;
    }
 
    public static LocalTime create(String format, String localeId, Optional<TimeZone> timeZone) {
        return create(new LocalTime.Data(format, localeId, timeZone)).getOrThrow(msg -> new IllegalStateException("Failed to validate format: " + msg));
    }
 
    private static DataResult<LocalTime> create(LocalTime.Data data) {
        ULocale locale = new ULocale(data.localeId);
        Calendar calendar = data.timeZone.<Calendar>map(tz -> Calendar.getInstance(tz, locale)).orElseGet(() -> Calendar.getInstance(locale));
        SimpleDateFormat parsedFormat = new SimpleDateFormat(data.format, locale);
        parsedFormat.setCalendar(calendar);
 
        try {
            parsedFormat.format(new Date());
        } catch (Exception var5) {
            return DataResult.error(() -> "Invalid time format '" + parsedFormat + "': " + var5.getMessage());
        }
 
        return DataResult.success(new LocalTime(data, parsedFormat));
    }
 
    public @Nullable String get(ItemStack itemStack, @Nullable ClientLevel level, @Nullable LivingEntity owner, int seed, ItemDisplayContext displayContext) {
        long currentTimeMs = Util.getMillis();
        if (currentTimeMs > this.nextUpdateTimeMs) {
            this.lastResult = this.update();
            this.nextUpdateTimeMs = currentTimeMs + UPDATE_INTERVAL_MS;
        }
 
        return this.lastResult;
    }
 
    private String update() {
        return this.parsedFormat.format(new Date());
    }
 
    @Override
    public SelectItemModelProperty.Type<LocalTime, String> type() {
        return TYPE;
    }
 
    @Override
    public Codec<String> valueCodec() {
        return VALUE_CODEC;
    }
 
    @OnlyIn(Dist.CLIENT)
    private record Data(String format, String localeId, Optional<TimeZone> timeZone) {
    }
}

引用的其他类